I'm having trouble understanding how Haskell (GHC) compiles programs, and how those programs are run.
To compile and execute a programming language on stock hardware you need a number of things:
C, Java, and GHC Haskell are examples of such systems. In the case of GHC, the entire architecture is described here. The pieces are also described individually, and in detail.
The runtime services (aka "the GHC runtime") are described over several papers: