В дотнете не байткод. Дотнетный IL достаточно высокоуровневый для того чтобы дать JIT компилятору информацию для оптимизации генерируемого машинного кода. У Франца претензия ко всяким байткодам только в этом и состояла. То есть этот вопрос снят полностью.
А использовать для хранения дерево или линейную структуру это немного другой вопрос.
Дерево, видимо, удобнее если при загрузке модуля генерировать для него сразу весь машинный код (включая код для процедур, которые фактически могут ни разу не вызываться) -- так делается в Обероне. В дотнете наоборот, там JIT компилятор компилирует в машинный код только те процедуры, которые реально используются (компиляция процедуры осуществляется при первом к ней обращении), поэтому уместа линейная структура, а не дерево. Что касается размера бинарных файлов, то в дотнете они и так маленькие. Ещё сильнее мелочиться особого смысла нет.