It really also depends on the type of game you make.
In my experience, loosely coupled objects almost always perform better since memory allocation occurs very infrequently, while referencing objects usually occurs in batches, and for specific tasks. I liked this approach because it prevents you to mess with a whole lot of virtual tables and class hierarchies. Virtual pointers break the code cache. So in this case I keep objects together in different managers, but with the same handle/id, and just run across a relevant set.
If expensive visibility queries are involved, it is often cheaper to keep several lists handy and update them only when necessary (e.g. time-sliced)
Another approach is to build dependency traversal trees using linked lists with parent/child relationships to only the relevant objects (a kind of tree-based skip-list). This is useful because somethimes you want to pre-build the transforms, or loop over all light-emitters, or first run all objects through collision detection and response, etc.. logically, any type of 'event' that has to occur on your gameworld can then be translated in a linked-list traversal. It saves you the managers, but it creates a whole lot of memory jumping and management to keep the parent/childs up-to-date.
If you can vectorize your calculations and get 100x speedup, well, that's a good reason to look at alignments and packing. At one time, we used a small object cache, to keep only those bits aligned in memory that would frequently be needed such as transforms etc.. in reality, though, you end up with so many isXYZ() calls before you even get to the transform, that this did not really pay off anymore. The idea was good, and there was some speedup at the time, but logic convoluted to the point it became meaningless.
The right thing to say is of course that it depends on the tasks and the number of objects or subsets thereof you have to deal with. If you don't know this at first hand but you suspect it can get out of hand, it depends on the time you have: If quite a lot, loosely coupled might be just the thing. Added bonus is that refactoring types is not really going to impact you that much. Otherwise, you may be better of just storing everything together and hope for the best..