1. Нормально. ООП для того и создан, что метод с одним названием может быть в разных классах, но работать по своему, если это согласуется с общей логикой.
2. По хорошему модель должна просто описывать данные, в крайнем случае возвращать связанные с нею наборы данных, но не возвращать экземпляры сторонних классов
3. Не тот случай, где надо заботиться о трате памяти. Вы же не 10000 экземпляров создаете. Но можно было бы сделать красиво
new ErrorView($data)
чтобы конструктор errorView возвращал представление по имени ошибки, а функции wrongLogin и wrongPwd были бы приватными.
4) А зачем там вообще die?