As with anything, it's in the middle ground that the best solution is often found.
I'm working on a piece of software that's so unfragmented that one of the exe it produces, which by all accounts ought to be around 10MB, ends up being 110MB. Because it's not possible to detangle the mess.<p>At the same time, too much fragmentation will lead you to, indeed, have so many callbacks and other "controller" classes that you'll need a non-trivial amount refactoring anything you need to add a new feature, because the previously chosen lines of delimitation don't correspond to what the new feature needs.