The operations against the system graph within JcrVersionManager are quite inefficient because they generally need to first read the content before they determine the changes that need to be made. They are, in fact, limited by the current capability of the graph framework, in that there is no way to push a request embedded with custom logic down to a connector. In essence, the graph needs the ability to allow graph clients to define self-contained functions and pass them as requests to be called/applied within the connector. IOW, the graph framework needs lambdas.
If this existed, then many of the versioning operations (and perhaps a number of the JCR-level operations) could be re-written as functions that can be simply passed to the connector, where the reading, logic, and writing can be done co-located with the data.