Почему в JavaScript получение данных в fetch сделано в 2 этапа?
Это сделано для максимальной эффективности. В response есть заголовки ответа, но ещё не загрузился контент. И в этот момент ты можешь поиспользовать заголовки и стартовать ещё одну асинхронную операцию, которая будет параллельна загрузке контента. Или просто забить на контент, не ждать его. В общем, более тонкая настройка последовательности действий.
добавлю в контексте PHP: можно пропихнуть в ответ произвольный заголовок,
из которого в JS так же получить некоторые данные,
и самое вкусное: можно на PHP непосредственно в сам ответ начать сессию и пропихнуть кукис, заголовки и данные, в том числе блоб (звук или видео к примеру)