Как правильно разделить компонент, хранилище и API запросы?
2. Мнение обратное Alex :
Я наоборот, предпочитаю все данные хранить в сторе. В компонентах только локальные переменные.
Все запросы к API расположены в экшенах и соответственно данные сразу кладутся в стор.
Обращение к стору только через геттеры. В компонент мапятся необходимые экшены и геттеры.

3. Перехват ошибок удобно делать в перехватчиках (interceptors) Axios. Конфигурируем опцию  validateStatus нужным образом и ловим все в одном месте.

Достаточно ли зависит от вашего случая. Скажем, есть вероятность, что нужно будет изменить один сервер АПИ на друго? Или в принципе изменить схему АПИ? 
Что касается глобальных данных. Тут может быть по разному. Я придерживаюсь следующего подхода: каждый компонент должен сам загружать нужные ему данные. А во Vuex хранить поменьше. Тут нет какой-то четкой границы. Например можно вынести все операции по работа с апи во Vuex и использовать его как хранилище кэша. Но нужно ли? Не лучше ли сделать кэширование честью модуля по обращению к апи? Или, например, вам нужно хранить историю последних действий пользователя. Для этого, например, можно использовать IndexedDB API.
Как по мне, то в том месте, где выполняется обращение. То есть, компонент, который запрашивает какие-то данные (сквозь сколько угодно абстракций), должен получать либо данные либо отчет об ошибке и сам решать как его обработать.  
