The Go runtime is essentially an implementation of UNIX ideas within a single OS process. The OS process becomes the "Host OS", while goroutines act as the process threads from early operating systems, blocking on any I/O operation.
Above all, this perspective provides the developer with a simplified mental model. The developer works with a sort of "Proto-UNIX", where each goroutine is a "process" and "channels" are "byte streams." And all this abstraction operates entirely within a single OS process of the real underlying OS.
This reduction and simplification is necessary as a design model for the programmer. It is like working at the high level of HTTP, where you don't think about packets. In essence, when we write in Go, we are writing for a "good old UNIX", where goroutines are "bash scripts" and channels are STDIN/STDOUT. This achieves complete abstraction from the underlying host OS.
In this sense, a Go program is essentially an interaction with a virtual machine. It is very similar to JS. The Go Runtime is a classic Virtual Machine in Tanenbaum's terminology: a beautiful interface over a complex underlying implementation.