El lenguaje C es un lenguaje estandarizado es decir, hay un organismo oficial que supervisa el lenguaje y establece cuales son los elementos y las reglas que ha de contener el lenguaje C para que se le considere "c estandar" o "ansi c" que son lo mismo.
Para que podamos decir que un determinado programa compilador es un "compilador de C" ha de ser capaz de compilar un archivo de codigo fuente escrito segun las reglas del lenguaje C estandar.
A la hora de compilar tu programa con gcc añade esta opcion:
Esto significa que la compilacion se hara conforme al estandar, en este caso sera segun el estandar c99.
No es logico que puedas compilar un programa usando la funcion getch() sin incluir la cabecera, de forma predeterminada gcc te lo compila sin problemas. Intenta compilarlo con la opcion de -std=c99 y veras como en este caso te dara errores de compilacion ya que segun el estandar para usar una funcion hay que hacer un #include al archivo de cabecera.
Ejcutables los hay de mil maneras y mil colores, depende del compilador que estes usando. Si estas en una maquina linux seguro que tu ejecutable no va a hacer uso de kernel32 ni ntdll. Si usas un compilador que crea ejecutables de 16 bits como el turbo c de borland, no hara uso de kernel32 pero si usara algun otro programa o dll a moso de emulador, para poder correr un ejecutable de 16 bits en una maquina de 32.