Дима, привет!

>> первый код оказался более понятен.

Да, первый более понятен, потому что перед глазами полностью await then/catch. А вот второй получается чуть более запутанным, потому что не понятно что это вообще за onCompleted. Но на самом деле в случае с использованием аполло-клиент такой метод более правильный, потому что в рамках АПИ данной библиотеки. Смотри официальную документацию: https://www.apollographql.com/docs/react/data/mutations/#oncompleted

То есть в качестве параметра onCompleted передается функция-обработчик, которая будет вызвана в случае успешного АПИ-запроса. Плюс здесь в том числе и в том, что ты еще до вызовы непосредственно запроса прописываешь какую логику ты хочешь получить, когда запрос будет выполнен и будет выполнен успешно. Иногда такой подход более понятный с организационной точки зрения. Но, опять-таки, это кому как больше нравится и совсем не обязательно делать именно так. Но понимать такие приемы очень важно, потому что часто библиотеки пишутся так, что в них приходится передавать обработчики. Это, что называется, callback hell (Ад обратных вызовов). Есть вот даже отдельный сайт, посвященный этому явлению :)