1) Отдавать нужно json строку с кодом ответа/статусом и тд, чтобы можно было на клиентской стороне обработать ответ и произвести необходимые действия.
2) В контроллере никакую логику не пишем. Она выносится в сервисный слой. (Это я про эту фразу "есть контроллер, в котором есть метод добавления товара в корзину").
3)
Также непонятно, что должен делать такой метод при обычном запросе не через ajax.. Делать редирект на предыдущий урл или корзину например?
Это уже вам решать. Тут все зависит от потребности. Хотя, я бы вообще не стал этот маршрут приспосабливать для "обычного запроса", создал бы другой специально для этого.