Зачем нужны внешние ключи прописанные в структуре БД (MySQL) — они действительно там нужны?
Любая СУБД имеет достаточно мощную систему контроля целостности и непротиворечивости данных. Эта система работает, используя набор правил контроля, описанных в структуре БД, и жёстко следит за тем, чтобы ни одно из правил не было нарушено.

Внешний ключ - это как раз такое правило. Сформулировано оно так: в данном поле таблицы не может храниться значение, которое не присутствует в той таблице, на которую ссылается внешний ключ (rонечно, в зависимости от конкретного текста ссылки внешнего ключа и самого поля тут возможны варианты - например, в этом поле может храниться не только значение, присутствующее в ссылочной таблице, но и NULL). И, имея такое правило, СУБД ни при каких условиях не позволит его нарушить. Любая попытка вставить запись со значением, которого нет в ссылочной таблице, приведёт к ошибке. Любая попытка изменить существующее значение на такое, которого "там" нет - приведёт к ошибке. То же касается и "второй" стороны, СУБД не позволит изменить значение в ссылочной таблице или удалить его (потому что записи в нашей таблице при этом "потеряют" ссылку) - такая попытка корректировки  приведёт к ошибке.
Смысл в том, что создать запись, или изменить ее ссылаясь на не существующий внешний ключ у вас не получится, если проверка внешних ключей не отключена. Грубо говоря, это способ сохранить консистентность данных.

На больших объемах данных и нагрузках внешние ключи могут сильно нагружать систему, так же они могу усложнить процесс миграций.

В большинстве случаев FK не нужны, от слова совсем.