The entire runtime does not depend on the OS. C's run-time is very minimal for exaple. You have a stack memory, heap etc that you setup in protected mode. Your OS will manage the page-tables, process creation etc.
"Go" binary will basically compile into machine code which can be run on bare-metal.
I advise you to read Project Oberon from Niklaus Wirth, originally published in 1992, revised in 2013 for targeting a FPGA instead of the Ceres workstation that was used at Zurich Institute of Technology (ETHZ) during the 90's.
A complete graphical workstation OS used by the IT department for their OS programming classes, language design and even by the non technical personal at the department.
Well, the Go runtime is written in Go itself. And you can write Go without the runtime, the same way the compiler is.
The hard part is that the runtime is indeed build on OS primitives (syscall mostly), that you have to implement yourself.
You have to forgo all the niceties of having a runtime but you can do it. Definitely not the most productive use of Go, but it's fun and you learn a lot.
That's a bit of a stretch. The runtime uses special pragmas that are not available to normal programs. I don't think it would be possible to write Go's GC in Go unless these special pragmas existed:
There is already a compiler that knows those special pragmas, one just needs to add a new bare-metal backed to it.
As for writing Go without a GC, just like in any other GC enabled systems programming language, by not using language features that require GC in the lowest layer, which the other packages then depend on.
On the lowest levels only. The rest of the OS can be GC'd. See Oberon, JX OS, and House in Haskell for instance. That Go has a low-latency GC makes it even better for that usage.