Как происходит присваивание Python?
Все очень просто. Рассмотрим ПОСЛЕДОВАТЕЛЬНОСТЬ выполенния:

x1=3
x2=5
x1=x2
x2+=x1
Вначале имеем x1=3, x2=5.
После выполнения первого оператора получаем x1=5, x2=5.
После выполнения второго оператора получаем x1=5, x2=10.

При выполнении 
x1=3
x2=5
x1, x2 = x2, x1+x2
Вначале имеем x1=3, x2=5.
Потом выполняем то, что вы написали последовательно,
x1=x2,  Но до завершении этой операции результат операции сохраняется во временной переменной.
Поэтому при выполнении x2=x1+x2 в процессе используются начальные значения переменных. Результат, кстати, тоже заноситься во временную переменную.
И только при завершении всего оператора результаты из временных переменных записываются по назначению.
В итоге имеем 
x1=5, x2=8

Попробуйте сравнить
x1, x2, x3 = x2, x1+x2, x1+x2+x3
и
x1=x2
x2=x1+x2
x3=x1+x2+x3
Станет понятнее.
На самом деле результат ЛЮБОГО оператора всегда сначала заноситься во временную переменную и только в момент завершения всего оператора переноситься по назначению. Но в одном случае это не влияет на результат, а в другом случае - влияет.
Почему они выдают разный результат? У меня все ок.
x1 = x2 = 5
x1, x2 = x2, x1+x2
print(x1, x2)

x1 = x2 = 5
x1 = x2
x2 += x1

print(x1, x2)
5 10
5 10