I wound up writing a ViewManager class to handle persisting views across routes. Example usage:
// On load
var FooView = Backbone.View.extend({ ... });
var BarView = Backbone.View.extend({ ... });
var vm = new ViewManager({selector: ".content");
// On route
var foo = vm.getView(FooView, {}, true);
vm.showViews([foo]);
// On another route
var foo = vm.getView(FooView, {}, true);
var bar = vm.getView(BarView, {}, true);
vm.showViews([foo, bar]);