Hi Jake,
Like Ankur said, the easy way to add instances is to copy/paste the whole directory and adjust things as necessary. Keep in mind that adding instances this way would not keep things up to date when one instance updates something, unless you've got something to share the repository (Mongo, shared Datastore, etc). If you're cloning Publish instances it helps to create a new replication agent for the new instance before making the copy, so anything activated while you're setting things up will queue up beforehand.
For migrating code and content to another fresh instance, I've found that content packages are a good way to accomplish this. The only caveat is that it doesn't include page versions. I'm currently looking into using the crx2oak tool to migrate content, as that should bring versions as well. You should include osgi configs in your code package or an /install folder on the local filesystem, rather than creating them manually through the osgi console. That way they're easier to manage and migrate.