We may want to expand beyond one router for a number of different reasons, including managing a single application with different behaviors for different devices.  In this case, you don't want to load every part of the app, just the parts that are necessary.  Lazy-loading the router like this makes it very easy to add that functionality in the future.

Also, in Marionette, the app owns its own event aggregator (app.vent).  Any other module may want to listen to or trigger application-wide events, and to do so it needs to declare the app as a dependency.

The only way to guarantee that a circular dependency won't be created in this way is to make sure that the app loads first (or actually second, after session), or use the CommonJS pattern on *EVERY* module, not just this one.  Since we know the order we want to resolve things, it doesn't make sense to add the burden of turning every single module into a CommonJS exports.