Технически это происходит обычно так. Когда вы вызываете 
Class.forName("..."), JVM подгружает этот класс и вызывает статический инициализатор этого класса. В случае с JDBC драйверами они, как правило, там вызывают статический метод 
DriverManager.registerDriver(...) и регистрируют сами себя (
пример для mysql). Регистрация представляет собой просто сохранение во внутреннем статическом списке. Далее, когда вы вызываете 
DriverManager.getConnection(jdbcUrl), DriverManager по этой 
jdbcUrl ищет подходящий драйвер (дёргая метод 
acceptsURL, который должны реализовывать все драйверы), далее подключается с помощью метода 
connect этого драйвера. Конечно, есть ещё много нюансов, особенно если касаться web приложений.
Чтобы вызывали 
Class.forName("...").newInstance() я не видел, это вроде ничем не отличается от просто 
new com.mysql.jdbc.Driver().
Собственно, ответ на вопрос: да, конечно нужен. Драйвер реализует общение приложения с базой данных (т.е. передачу SQL запросов в БД и возврат результатов), без него никак. Если вы не видите, что класс драйвера и его настройки прописаны явно, скорее всего где то во внутренностях кода/ресурсов они всё таки есть.