Вопрос: Как происходит линковка приложений?

Лучший ответ: runime - это по сути просто стандартная библиотека. Прослойка между вашим кодом и ABI системы. Как и любой другой код он может быть как статический так и динамический. У статического и динамического runtime-а свои плюсы и минусы. 
Приведу некоторые из них
У статического
+ Нет зависимостей, все что нужно исполняемому файлу - только операционная система.
+ Как следствие предыдущего пункта, ОС что бы его запустить нужно прочитать с диска и инициализировать только один файл. Потенциально может ускорить запуск приложения. 
- Размер файла сильно возрастает
- Использование dll (ну если вдруг захочется плагины, например, к себе прикрутить) сильно усложняется. Надо быть довольно осторожным.
У динамического
+ Размер файла не распухает
+ Рантайм делиться со всеми загруженными dll, по сути присутсвует в единственом экземпляре.  
+ Работать с dll становиться немного проще. 
- Что бы хоть чего-нибудь запустилось - нужно позаботиться о том, что на машине установлен нужный вам рантайм, что усложняет процесс доставки конечного продукта до пользователя. По сути уже нужно делать инсталер. 
- Нужно следить, что все динамические библиотеки которые используется в приложение были собраны с нужным рантаймомо. Это не всегда тривиально. 
Теперь про вопросы. 
1) Нет. msvcr120.dll - это просто рантайм от VS2012, у VS2015 будет что-то msvcr140.dll. У gcc - что-то еще. Как я уже говорил, runtime -  это просто код, который нужно куда-то положить. И у каждого поставщика стандартной библиотеки он свой. 
2) Да это правда. Основное отличие - это поддержка стандартов и расширений. VS2010 от с++11 поддерживала совсем ничего, а вот VS2015 уже поддерживает c++11/14 и немного 17 (ну с оговорками на MS и о том как они поддерживают стандарты). Это тоже код и его куда-то нужно положить. Плюс, довольно распростроненная проблема - это ABI. Порядок полей в классах (например), который никак не оговаривается стандартом, делает бинарные реализации не совместимыми, если порядок не совпадает (если сильно по простому). 
3) Там лежит стандартная библиотека. 
4) Нет, на то она и dll. Но как правило многие библиотеки распространяются в двух видах - динамическая линковка + статическая. Или если это opensource всегда можно для себя собрать статичскеую библиотеку для того что бы статически слинковаться. 
5) Конечно, что-то добавляет. Runtime C++ добавляет еще больше. Плюс надо понимать, что еще есть runtime для OC, который позволяет вызвать ее функции как функции, а не через прерывания или еще как. Теоретически можно работать без всего этого добра, но будет грустно.

Худший ответ: 1.обычно у каждого компилятора свой runtime. Для VC - это разные версии msvcrt.dll.
2.Читайте на сайте разработчика компилятора. В основном это не сильно принципиально, разве что вы используете какие-то специфические плюшки, которые не описаны в стандарте, но есть в конкретном компиляторе и его стандартной библиотеке.
3.runtime - это как правило стандартная библиотека + точка входа и завершения программы (а ваш main вызывается уже из runtime).
4.Можно. Обычно стандартная библиотека поставляется как в виде динамической библиотеки, так и статической. Выбор какую использовать за вами, задается опциями компилятора.
5.Не большой. Но тут лучше говорить не про оверхед, а про "написание программы на чистом" WinAPI/POSIX и других OS API. На сколько это трудозатратней по сравнению с использованием стандартной библиотеки.
По собственному опыту скажу, что написание на чистом WinAPI довольно трудозатратное (и время затратное) занятие, затратнее примерно в 1.5 по сравнению использованием stdlib. Но у меня это был первый и пока единственный опыт, дальше, видимо должно быть проще.