GHC статически связывает все (кроме библиотек, используемых самой средой выполнения, которые связаны динамически).
В старые времена GHC связывал всю (haskell) библиотеку, как только вы что-то из нее использовали. Некоторое время назад GHC начал ссылаться "на файл obj", что резко уменьшило размер двоичного файла. Судя по размеру, вы, должно быть, уже использовали более новый GHC.
Что касается плюсов, в этих 500 КБ уже есть много вещей, таких как многопоточное ядро, сборщик мусора и т.д.
Добавьте хотя бы сборщик мусора в ваш C-код, затем сравните их снова:)