По сути эти обе функции в Python выполняют одно и то же действие — приводят текст к нижнему регистру.
А если нет разницы, зачем… их две?
Разница в работе этих двух функций заключается в обработке некоторых специальных символов (примеры есть в мануале и в Интернете). Ну ок, они как-то по-разному обрабатывают такие символы, которые в большинстве практических случаев нам и не попадутся. Так когда же использовать одну функцию или другую?
.lower() — используем для показа текста пользователю.
Т.е. если мы хотим вывести на экран текст в нижнем регистре, который потом будет читать наш пользователь, lower() — наш вариант.
.casefold() — используем для сравнения.
Если нам, например, нужно будет искать в строке подстроку без учета регистра — сбрасываем регистр с помощью .casefold().