global - НЕ функция, а оператор. Указывающий, что любое обращение к переменной name внутри функции say_hi производится не к локальной переменной, существующей только внутри функции, а к глобальной (объявленной вне функции) переменной name.
global используется для того, чтобы внутри функции менять данные, которые используются где-то в другом месте кода, минуя механизмы передачи параметров в функции и возврата значений из функций.
Единичные использования global могут иметь смысл: если автор кода - сторонник процедурного программирования и ООП вообще не использует.
Но частое использование global или одновременное использование и global, и class - очевидный признак говнокода.
Приведённый пример не имеет смысла. Куда нагляднее так: def say_hi():
global name
name = "Bob" # изменяем значение глобальной переменной
name = "Tom"
print('Hello', name)
say_hi()
print('Hello', name)