Ответ 1
Сборщик мусора GHC является параллельным, но не параллельным. Это означает, что он может использовать все потоки для сбора мусора, но для этого нужно остановить все потоки. Одновременная сборка мусора гораздо сложнее реализовать (и, как правило, имеет более высокую производительность).
Несколько иронично, что Haskell действительно использует множество изменяемых объектов, а именно thunks (неоцениваемые выражения). Объекты Mutable не могут быть свободно дублированы (и даже для неизменяемых объектов слишком много дублирования следует держать под контролем).
Для программ, работающих на нескольких ядрах, имеющих действительно параллельный сборщик, было бы неплохо, но вы также можете получить приличную выгоду, сделав кучу локальных сборщиков мусора. Идея состоит в том, что данные, которые не разделяются между несколькими процессорами, могут собираться только владельцем ЦП. Обычно это относится к краткосрочным данным. Саймонс проделал некоторые недавние работы в этой области. См. Их статью "Многоузловая сборка мусора с местными кучами" (PDF). Эта статья также показывает некоторые способы, как вы можете использовать неизменность таким же образом, как вы предлагаете.
Изменить: я забыл упомянуть, что Эрланг в основном делает именно то, что вы предлагаете. Каждый процесс Erlang имеет свою собственную кучу, и отправка сообщения копирует данные из одного процесса в другой. По этой причине каждый процесс Erlang может выполнять собственный GC независимо от всех других процессов. (Недостатком является то, что Erlang не дает вам общую память concurrency.)