В вашем коде всегда есть ненулевой шанс наличия ошибки (бага).
- Рекурсивный setTimeout лучше тогда, когда ошибка должна приводить к остановке выполнения кода, то есть к отказу от дальнейших попыток его выполнить.
- Обычный setInterval лучше тогда, когда код должен продолжать попытки выполниться, не смотря на ошибку.
В остальном разницы почти нет. Если повторов слишком много, то setInterval предпочтительней, чтобы сократить количество перерегистраций вашей функции.
Также рекурсивный setTimeout может быть интересен, если величина задержки не является константой, то есть каждый раз будет меняться.