Basically asynchronous module loading can be done just by creating multiple bundles with Browserify and loading them with a script loader of your choosing. There is one in jQuery or if you don't like jQuery there are quite a few standalone ones out there.
To detect modern enough browsers for Zepto we check for document.querySelector implementation.
To do this we need to build simple lightweight entry point with a script loader and two versions of the main bundle. One with Zepto and one with jQuery.
// The main bundle has require calls to both jQuery and Zepto.
// We set a global flag indicating which one we are using.
// We use this later to detect which one we can require.
And in app code just use var $ = require("./jquery-or-zepto"); to get the correct one depending on the bundle we loaded.
Now just include ./bundle/main.js to the page and ./bundle/graph.js will be loaded lazily when needed.
Checkout the externalize readme file for more information.
I've uploaded a more real worldish example on github pages using the techniques presented here. It will also serve as a decent Backbone.js and Handlebars example with Browserify. It's heavily commented so it should be easy to follow even if you don't know/care anything about Backbone or Handlebars.
Open up devtools from your browser and look at the network tab to see what happens when you hit to "Toggle graph" button for the first time.