1. На собесах проверяют ваши навыки того или иного языка и то, как вы им владеете. Уметь пользоваться аннотациями типов это навык, так что можете считать что косвенно - проверяют.
2. Стоит.
3. Использование аннотаций не привязано к размеру проекта, так как вы правильно заметили, сложно найти информацию о том, какой проект является большим, а какой маленьким.
4. Аннотации желательно использовать всегда.
5. Писать прямо в коде, читабельность не падает.
Читабельность может быть и падает, если функции принимают или отдают вложенные типы, но это стоимость того, что вы сможете быстро понять, какие объекты нужно подать в функцию или какие объекты ожидать в ее выходе.
def some_func(var1: int, list1: List[int, str], dict1: Dict[str, List[int]]) -> Tuple[str, str]:
# some logic
result1 = # some string result
result2 = # some string result
return result1, result2
Если представить, что аннотаций нет, как вы будете узнавать где какой тип данных используется?
def some_func(var1, list1, dict1):
# some logic
result1 = # some string result
result2 = # some string result
return result1, result2
Даже в этом примере видно, насколько осиротела функция без аннотаций, чтобы понять что подается на выход нужно смотреть на результат присвоения значений объекту result, а чтобы понять что же за var1 и что нужно подать в функцию вам придется смотреть на то место, где var1 начинает использоваться.
А теперь представьте что это ваш пет проект и вы его забросили на месяц, вы не сможете вспомнить ни одну функцию, вам придется над каждой функцией сидеть и думать, что же она возвращает и делает внутри. С аннотациями вы просто посмотрите на них и все станет понятно. То же самое, но в еще больше степени относится к тому, если код без аннотаций вам достанется по наследству от коллеги или от какого-то подрядчика, это будет больно и неприятно.