Стоит ли бросать кастомные ошибки, если этити не найдено в API?
Своей класс исключения имеет смысл бросать, если у вас для этого класса описан хэндленр, который сформиует правильный по бизнесу http ответ например.
Вот тут описано как это делать
https://spring.io/blog/2013/11/01/exception-handli...

А строки не обязательно конкатенировать, можно использовать StringBuilder или String.format() например.
Добрый день!
Наверное, это зависит от того, как вы в команде договоритесь.
Вы можете выбрасывать кастомные эксепшены, а далее ловить их в Controller или ControllerAdvice и отдавать соответствующее сообщение на клиент с кодом ошибки.
Также можно обернуть entity в Optional и выбрасывать исключение orElseThrow() или возвращать другой объект (orElse()) или новый объект и т.д.

Optional<Vote> voteOptional = voteRepository.findById(voteId);
        if(voteOptional.isEmpty()) {
            throw new ApiException("Vote with id " + id  + 
                    "is not in DB");
        }
Можно же упростить:
Vote vote = voteRepository.findById(voteId).orElseThrow(VoteNotFoundException::new);

Но с другой стороны, если с фронта все правильно настроено, то таких ситуаций и не должно быть.
не нужно надеяться на клиент. Например, человек может сам совершить запрос при помощи Postman и передать некорректное значение.