DEFINING new GObjects is what is not so common
It's extremely common, just not in Geany. It makes it much easier for external contributors when the code is idiomatic for the toolkit (ie. using GObject normally). I've been able to study the code for and contribute to a number of projects easily because they used the toolkit in the usual way instead of doing all kinds of ad hoc things.
I don't think signals will be right for most of this stuff, though I'm sure we'll add some (hopefully not jamming more into the GeanyObject singleton god object). At worst we should use our own NiH virtual functions like we do for the plugin API now, IMO, though as @kugel- mentioned it does make it harder for binding to other languages, even for hand-written bindings like GeanyPy.