Либо то, либо другое. И то, и другое - можно, но бессмысленно.
В exec() передаётся два аргумента - ошибка и данные (вернее, данные в аргумент callback-функции), в then() - один, естественно, только данные (точнее, данные в аргумент resolve).
Then - это использование промиса. Это значит, что можно - как обычно с Promise - делать return результата (т.е. передавать его в следующий then), а потом ещё раз then, и ещё раз... - ну, если надо такое. А в общем случае - без разницы.