При даункасте нужно сначала проверить, можно ли привести тип к нужному, и кинуть исключение, если нельзя.
Бросание исключений - дороже, чем просто вернуть false или null, как в случае с is/as.
А апкаст гарантированно всегда пройдёт, по тому он дешевле, чем даункаст - JIT просто убирает код, который отвечает за кидание исключений.
По тому в случае апкаста as T и (T) даёт одинаковый результат.