как может различаться по производительности код:
Сильно. Ведь исключение бросается всякий раз, когда нужно выполнить проход по массиву. Это просто нерационально.
почему обычно не используется 2й вариант кода?
Во-первых, из-за оверхеда.
Во-вторых, слово "исключение" как бы говорит нам, что оно генерируется в
исключительной ситуации. Что такого исключительного при достижении конца массива? Это нормальная рабочая ситуация, и исключение здесь, в принципе, неуместно.
В отличие, например, от контроля за попадением в диапазон при произвольном доступе - в этом случае "непопадание" будет именно исключительной ситуацией, потому что в нормальных условиях случаться не должно (если ненормальный код, написанный ненормальным программистом, не гадает, куда ткнуться)