Turns out what worked was to override the Backbone.Router and then add logic to conditionally execute the line with callback.apply:
_.extend(Backbone.Router.prototype, {
route: function(route, name, callback) {
var that = this;
if (!_.isRegExp(route)) route = this._routeToRegExp(route);
if (!callback) callback = this[name];
Backbone.history.route(route, _.bind(function(fragment) {
var args = that._extractParameters(route, fragment);
if (myCustomLogic) {
callback && callback.apply(that, args);
that.trigger.apply(that, ['route:' + name].concat(args));
that.trigger('route', name, args);
Backbone.history.trigger('route', that, name, args);
}
}, that));
return that;
},
});
Appears that the browser forward/back buttons are getting handled by Backbone.Router where other navigation is handled via Marionette.AppRouter.