While I think all mentioned methods would work, I've never heard of any production using one of them. (This might of course just be my limited experience.) These situations usually come up only once in a while and accounting for them in every single rig by wasting (a little) performance is often not worth it.
The only solution I've actually seen in production is "trying to keep things close to the origin". Let me explain:
The easiest situation would be if a more or less stationary character just "happens" to be 1 million units from the origin. That can easily be remedied by translating character, set and camera to the origin. No performance impact on the scene. You might need to keep track of your offset in case it matters later.
Things get a little harder if a character moves 1 million units in one shot. In that case all you really care about is the motion of the character relative to the camera. Example: The camera follows the character at the same speed. That means the character appears motionless and could as well stay in the origin.
Usually the situation is a little more complicated so you would use the inverse motion of the camera, subtract that from the motion of the character and the set and then keep the camera in the origin. That should keep things pretty close to the origin. And best of all: You don't even need to do this in the animation scene (unless the results jitter so much that animation isn't possible anymore). If all you want is eliminating the precision issues for rendering and motion blur, you could use this technique while caching your scene for rendering keeping your animation scene lighter and faster.
But if I had to pick from the solutions above I would also go for using the inverse matrix on the transform and not applying another blendShape deformer.
Hope that helps and please let me know if I got anything wrong.