The translation happens before the net message is sent in selectionListGameNetMessageInternal which has a parameter that specifies if a translation should happen or not.Automated missions originate in the AI code, where everything is already in global coordinates. Your popup will be inserting missions in the UI, where things are viewport coordinates usually (depending on where the addition of the popup is placed in the existing code sequence).
So now if you move a unit (or start a mission) in the UI the sequence goes something like this:
1) UI commend intercepted (coordinates from the UI are viewport)
2) Mission request created
3) Net message sent with the mission request
4) Net message received. For missions that contain coordinates the coordinates are translated to global
5) Mission pushed
Note - I'm not 100% sure the net message happens upstream of the coordinate conversion, as the above sequence says (but I think I does).
Where you add the code to inject the popup matters. Logically you'd want to inject it upstream of the net message generation since you only want to replay the results (not the popup choice!) on all machines in an MP game. Thus if the net message deals with viewport coordinates for a regular MOVE_TO mission you will have to add a new MOVE_TO_GLOBAL (or something) mission that is in global coordinates (since viewport coordinates won't exist for cities outside the viewport), and NOT translate it in the translation code on net message receipt.
Automated missions go through none of this since they all happen inside the AI (the net message is just an instruction to start automating)
selectionListMove takes a plot pointer, not coordinates and then uses absolute coordinates of the passed plot and passes them to selectionListGameNetMessageInternal with the right flag set so they are not treated as viewport coordinates.
So at the point a mission is pushed, it is always in absolute coordinates and a new mission is not needed.