I chose the return route to maintain consistency with other methods.  For instance, in the payload compression module I'm unable to modify the HubOutgoingInvokerContext.Invocation so instead I create a new one and return that instead.

My thought was that maybe a dev will have their own negotiation response builder and instead of inserting keys to maintain the reference they would instead just return a different object.

Again, let me know if you still feel like this isn't a good approach