Указатель дает вам (якобы) большую гибкость - потому что можно передать туда nullptr и изменить тем самым логику работы вызываемой функции - вроде как сказать "мне этот параметр не интересен, его можно не считать". Эта практика пришла из C, в котором нет перегрузки функций.
Но! В некоторых случаях, это создает проблему - если передать nullptr в функцию, которая всегда ожидает указатель (и не проверяет на null) - программа крашнется.
Ссылка же позволяет гарантировать, что значение передано и его можно не проверять на nullptr - таким образом, ошибки времени выполнения можно сместить на время компиляции, что очень даже хорошо.
Теперь о быстродействии - тут все плохо с однозначным ответом, который вы, автор вопроса, хотите получить. Дело в том, что компиляторы-оптимизаторы C++ нынче настолько умные, что они могут, в зависимости от контекста, сделать полностью идентичный код для ссылок и указателей, так что ответить на ваш вопрос с гарантией невозможно. Однако, вероятность того, что ссылка оптимизируется лучше чем указатель все же есть - потому что компилятор всегда уверен, что ссылка на что-то смотрит.
Вывод примерно такой - если всегда нужно что-то возвращать через параметр, и исключений из этого правила нет - лучше применять ссылку - это как раз еще раз утвердит для программиста требование задать этот параметр.
Если же параметр не является обязательным, лично я рекомендую сделать перегруженную версию функции без этого параметра - это избавит от условного оператора и сделает код более легковесным и читаемым, уменьшив количество передаваемых аргументов. Обратите внимание, что удаление условных операторов сильно влияет на быстродействие в некоторых случаях - потому что условный переход сбрасывает (не всегда, но сбрасывает) конвейер команд.