This seems like good practice, trying to lower the amount of stuff to process per tick.
I do something similar, but haven't utilised group enabling/disabling - I usually use a top level event with an individual boolean like "IsActive", so then all objects do 1 check, and if some are active and some are not, this works well. Beyond this, there might be a sub event for a "IsLightweight", so that very minor things to check are checked, but if that is also false, then this means it's probably an important object that there aren't many of, so it'll check for some more heavier events for these objects.
This is comparable to what you do with "is bullet behvahour enabled", but you could put some more stuff below here, such as "bullet is overlapping enemy", as you know you'll only care about detecting collisions if that bullet is active. HOWEVER, some events or conditions, such as collisions, really benefit from being a "top level" condition, because it let's it use collision cells, whereas having "is bullet enabled" first, would prevent collision cells from working, thus making performance worse. Best to just test this, make lots of bullets exist and compare CPU performance with different ordered events/conditions, you might be surprised by the results.
Then ofcourse having groups helps when you use the debugger and can easily identify which groups need more attention to optimise.
So overall, yeah, good job!