For hard real time, pauses may also be fine. "Real time" just means that the timings have fixed upper limits. As long as the pauses can never cause timings to be missed, they do not cause a problem.
Garbage collection will /always/ take some time (as will any other method of recycling resources) - you just have to make sure it does not take /too/ long at the wrong time.
Hotspot at run time means spending time tracking statistics about how often code sections are run - so there is an overhead there. It can also be predicted at compile time (such as by looking at which functions are called within big loops, or even just manual annotations in the code) - these have no run-time overhead, but can be less accurate.
My understanding was that C# was byte-compiled, much like Java usually is. But I am sure it can also be fully ahead-of-time compiled (again, like Java), and I have no idea of the quality or features of typical C# VM's.
Profile-driven optimisation has been around for a very long time, where run-time statistics are used to improve the next compilation of the code. It is unlikely that dynamic run-time JIT on native code will do a better job there, but it is possible - especially before compilers typically did things like function cloning and link-time optimisations.
I think it is surprising that you think many people think "JIT == slow". I suspect most people think JIT is a way to make byte-code execution in VM's run faster.