"А C вообще какой-нибудь язык обгоняет?" - нет никаких языков, все языки испаряются на этапе компиляции. А вот дальше как оно работает - это вопрос. В сишняке можно сильно "помочь" компилятору, т.е. написать такой код, который будет максимально эффективен на выходе. А в дот.нете такое в принципе невозможно. Но дот.нет не для максимальной эффективности. Дот.нет про другое. При этом, дот.нет весьма эффективен. Если в нём заюзать гибридный подход. Быстрые собственные аллокаторы например. В чём дот.нет точно проигрывает - это в памяти.
Всё что есть - это подготовленные данные, и алгоритмы над ними. Как вы это всё организуете - так оно и будет работать. И ничего другого - нет, и не будет. Если вы это всё организовываете плохо - оно и на сишняке будет тормозить. А если вы это всё организовываете хорошо - оно и на дот.нете взлетит. Первична эта самая "организация". Это архитектура, вменяемые подготовленные данные под алгоритмы, вменяемый мемори-менеджмент, вменяемые железяки, и знание того как это всё вместе работает. Это сложно.
Дот.нет - это рантайм+фреймворк. Рантайм дотнета весьма не плох, хотя некоторые вопросы к рантайму всё равно остаются. А вот фреймворк - ужасен. Рантайм дот.нета писали как будто бы гении, а фреймворк писали совершенно другие люди, пусть студенты полуподвальные. Именно потому никто не пользует набор стандартных библиотек дот.нета - это и есть фреймворк. Он [этот набор] убожественный. Пример - есть стандартный словарь, он отдаёт элементы за некое X. И есть вменяемая реализация словаря, она работает на порядок быстрее. И весь фреймворк такой. Т.е. никакущщий.
Это я к тому, что некие программки на дот.нете - ЭТО ЧТО? Это настолько широкое понятие, что сходу дать определение этому - весьма затруднительно. А вы пытаетесь производительность этому всему обозначить. Ну да ну да. :)