Нормально Си в качестве бэкенд использовать.
В качестве примера:
Vishap's Oberon Compiler (voc). Вообще, Оберон (не Оберон-2) удобно рассматривать в качестве языка, который прост и у него есть приличное количество реализаций как с байткодом, так и на целевые платформы.
Можно еще WebAssembly генерировать, при помощи Cranelift IR.
Хотя иметь LLVM в зависимости не так уж и плохо.