Какой правильный путь в Symfony для этого?
Правильный путь, это использовать serializer.
Не знаю почему у вас такие сомнения в производительности этого инструмента. Т.к. у него есть даже кеширование при работе с сущностями доктрины.
Если просто из любопытства, то прослойку действительно можно убрать.
Таким образом/**
* Примерная реализация метода получения билета по id
*
* @param int $id
* @return array|null
* @throws \Doctrine\ORM\NonUniqueResultException
*/
public function findAsArray(int $id): ?array
{
return $this->createQueryBuilder('t')
->select('t, u, a')
->join('t.user', 'u')
->join('t.answers', 'a')
->andWhere('t.id = :id')
->setParameter('id', $id)
->getQuery()
->getOneOrNullResult(\Doctrine\ORM\AbstractQuery::HYDRATE_ARRAY);
}