Как организовать пользовательские классы?
Да, всю логику нужно выносить в отдельные классы.

Задача контроллера - определить, какую информацию исходя из полученного запроса показывать. Даже валидацию лучше выносить в отдельный Request, потому что это уже не задача контроллера. 

Я обычно делаю сервисы, как вы написали, но еще и:
/app/Repositories - репозитории. Позволяют в контроллере брать информацию из БД, типа такого:
$this->postsRepository->getPostsForHomePageLoop();

А вообще способов много - можете прочитать про паттерны проектирования.

Главное помните про SRP из SOLID. Что каждый класс отвечает за свою функциональность и не может выходить за её рамки.
Используй 4 и 5 способ из статьи.  В идеале в контроллере должна быть только валидация через FormRequest с передачей данных в сервисный слой.

class ClientReportController extends Controller
{
    private $reportService;
    public function __construct(ReportService $service)
    {
        $this->reportService = $service;
    }
    public function index(Request $request)
    {
        $entries = $this->reportService->getTransactionReport($request->input('project'));
        // ...
    }
    public function income(Request $request)
    {
        $entries = $this->reportService->getIncomeReport($request->input('project'));
        // ...
    }
}