This will obviously increase complexity and infrastructure requirements, but in an application that we built, we actually took a hybrid approach.
1. Store documents in MongoDB, as is.
2. In our app, transform the documents into appropriate nodes and edges, and persist those in Titan (we used Cassandra+ES).
A great benefit of this is that if you want to change your graph's ontology, you can just iterate over the documents in Mongo, replaying the (new) transforms to fit the new ontology.
We ended up keeping a reference to the original Mongo ObjectID as a property on every node and edge, so that we could retrieve the documents from Mongo when needed.
Another option is also to just store the data in the graph only, IF your documents otherwise map 1-1 to nodes and edges. In most (all?) of the graph db's I've seen you can attach arbitrary properties to vertices and edges (In Titan, even hashmaps, if you want to do sub-documents -- just be careful if you need to do any "update" operations on these).