Просто если аватарки пользователей это одно, а если например фото отчёт с вебкамер в режиме реального времени, то graphql не справится с этим. Но я у себя это решил более элегантно. У меня мутация возвращает подписанную ссылку на s3, а после загрузки webhook сравнивает то что загрузил клиент и то, что он отправил в мета данных. Таким образом можно удалить поврежденные файлы или попросить догрузить клиент. Graphql выступает в роли подрядчика, выдавая подписанные ссылки на получение и загрузку.
В компании где работаю, загрузка была на основе stream buffer, нода не вывозила. Текущее решение и по безопасности лучше, а нагрузка вообще пропала