Два одинаковых кода, но один не хочет работать! Почему?
Зачем так сложно?
Прочтите внимательно это
for i in range(word_count, 0, -1):
На первой итерации цикла i примет значение word_count.
Символы в строке word имеют индексы от 0 до word_count-1.
Так что индекс, равный word_count, не существует. Ты поймаешь исключение IndexError.

 И можно ли его написать более компактно? Если да, то как? 
Освоить срезы (slice). part = word[a:b:c] будет (условно) эквивалентно
part = ''
i = a
while i < b:
    part = part + word[i]
    i = i + c
для положительного c. А для отрицательного будет while i > b:.
Если a опущено, по умолчанию это начало последовательности (для c > 0) или конец (для c < 0).
Если b опущено, по умолчанию это конец последовательности (для c > 0) или начало (для c < 0).
Если c опущено, по умолчанию это 1.

Так что для обращения строки нам нужно пройтись по всей строке с шагом -1. Получим вот что:
word_reversed = word[::-1]
# это эквивалентно
word_reversed = word[len(word)-1:-1:-1]