Коллеги!
Давайте без шапкозакидательства, пожалуйста...

Kernel нужен. Он нужен потому, что это run-time механизм языка.
Без него никак. Просто где-то он задан явно (Oberon), где-то неявно (C), а где-то и так, и так. Но он есть везде.

Другой разговор, что может не нравиться содержимое Kernel.
Ну так не смотрите

Мне (уж коль скоро я в Kernel лажу весьма бесцеремонно), не хватает только одной возможности - ограниченного импорта. Т.е. импорта в рамках фреймворка.

Пример
Модуль Init получает значение errno из загрузчика. Передает его внутрь kernel. Можно было бы просто установить значение переменной и сказать, что ее читать могут все, а устанавливать только модули фреймворка (или даже только конкретные модули фреймворка). На деле же делаю процедуру с возможностью запуска один раз и read-only экспорт.

Далее, подсистема Host локализует платформенно-зависимые вещи. Это правда. Но не вся. Самому Kernel'у необходим какой-то механизм, с помощью которого производить вывод сообщений без инициализации остального фреймворка. Поэтому и в Kernel будет в наличии платформозависимый код.

Посмотрите, как реализован Linux-вариант BB. Из него вырезана привязка к WinAPI и тексту. И что? По-прежнему в Kernel присутствует процедура printf из Libc равно как и dlopen из dl. Платформозависимость налицо.

По известной мне информации кросс-платформенные системы содержат около 20% зависимого кода. Вопрос лишь в его распределении этих 20%.

В ББ в целом баланс соблюдается. Платформо-зависимые части хорошо локализованы. Важное замечание (и для меня это самая большая претензия) - "текст как интерфейс" является "единственно правильным" в ББ, остальное сложно (хорошо, сложнее) реализовать. И текстовый интерфейс, на мой взгляд размазан по системе сильнее, чем платформо-зависимые части.

И очень интересно видеть, как ББ без текстового интерфейса работает. Очень сбалансированная, быстрая и надежная среда. Главное - все понятно