0) Контексты могут быть вложенными. Компонент ищет ближайший провайдер. Это позволяет обернуть часть приложения в провайдер с другим значением, и такой кейс на глобальных переменных не сделать.
1) упомянутый в комментариях ререндер компонента с хуком useContext на борту. Но это если само значение контекста меняется. Часто бывает, что значение постоянное (классический пример - подключение редукса к реакту), далее подразумеваю этот случай.
2) DI для компонентов. Компоненты не резолвят сами свою зависимость, им её инжектят снаружи. Более гибко с т.з. архитектуры, тестируемости и т.д. Правда, с другой стороны, у компонента появляются неявные зависимости, но в контекст можно зашить значения по умолчанию.