Well, I've probably found the answer myself. It was only while starting to write this post that I actually understood what was happening - at first, I didn't even realise that it was due to an in/mm issue - and as a result googling around for answers wasn't very useful. You do need to know the right question before you can get the right answer...

Looks like Mach3 doesn't really handle in/mm G20/21 commands the way I would expect. However, it should work OK (according to what I have read) if you load the gcode, and then set the work coordinate zero. I was setting the work coords and then loading gcode. It still doesn't make much sense to me, but at least it looks like a way to handle gcode created using the "other" set of units.