В первую очередь нужно посмотреть наследование, как они работают:
Если вы обратите внимание то webapi и asp.mvc(далее просто mvc) контроллеры наследуются от разных классов Http.ApiController и Mvc.Controller.
Нужно понимать что webapi предназначен для реализации REST сервисов с охватом всех видов http запросов(GET, PUT, POST, DELETE итп) и ответом на запросы к webapi вы получаете json с явным указанием
статуса ответа.
В MVC можно реализовать то же самое что и в webapi, НО! лично я считаю, что эти вещи нужно четко различать, так как в случаи с MVC, вы должны понимать, что результатом запроса в большинстве случаев является сгенерированная вьюшка, то есть результат http запроса в большенстве случаев это html или что-то похожее. Да в mvc тоже может возвращаться структурированный json(например если вы делаете таблицу с пагинацией или с динамической подгрузкой данных, в таком случаи у вас метод Index возвращает вью на которой вы пишете ajax запросы к методу GetPageForTable этого же контроллера, но тут тоже есть вариация, вы в методе GetPageForTable вольны решать, отдавать только данные или уже сгенерированную вьюшку).
Как итог: webapi - рест сервис со всеми типами http запросов, в котором ответ(по умолчанию) приходит в структурированном json и с явным статусом состояния(200, 404 итп...) . Хорошо подходит для проектов где клиентом может быть не только веб, но и допустим мобильное приложение или еще что-то.
MVC - работает примерно как webapi но результатом может являться сгеренированная html разметка. В таком случаи уже поддержка многих платформ с клиентской части невозможно, представьте, что делать мобильному приложению с html разметкой...