Я периодически создаю классы, которые и не модели и не контроллеры - т.е. они просто содержат в себе всякие функции-утилиты.
Вы создаете сервисные классы.
А что я вообще получаю от класса Controller в своих контроллерах?
Работу с запросами и ответами, сессии, куки и т.п
Например, инъекция зависимостей в функцию - это от него?
Нет, это по всему ларавел приложению работает. Можете определить свой класс и использовать DI там.
Как понять где он мне нужен а где нет?
Если ваш класс не содержит работу с запросами и ответами, то нет смысла наследоваться от Controller.
Можете залезть во внутренности базового класса контроллера, посмотреть, что он содержит. Лишним не будет.