В том, чтобы возвращать интерфейс, проблемы как таковой нет. В некоторых случаях иначе никак бывает. Просто надо понимать, что возвращая интерфейс вместо реализации, мы просто лишаемся гибкости в некоторой степени. И никогда заранее не угадаешь, где и когда эта гибкость может понадобится. Поэтому и существует эта _рекомендация_ - по возможности всегда возвращать реализацию. В общем случае минусов нет, зато плюсы есть.
Вот тут я совсем не понимаю, объясните, какой гибкости? Возвращая интерфейс, на мой взгляд мы наоборот получаем гибкость, т.к. можем подменить его любой реализацией (не нарушая контракта). Все чего мы лишаемся, это грязных хаков и говнокода, когда мы возвращая везде структуру, в какой то момент захотим таки нарушить контракт и дернуть оттуда деталь реализации которую не должны дергать напрямую. Потом мы дернем в другом месте другое поле структуры, а потом третье, и так далее, пока код не превратится в лапшу.