Rubinstein plays a poor opening.
Rubinstein's 6.g6 has never been a popular move and in this game does not even achieve the fianchetto.
9...exd6 looks like an automatic response. 9...Ne5 is better: (10.dxe7 Qxe7 11.Be2 Bg7 equalises)
10...Be7 is the decisive mistake. This was Black's last chance for 9...Ne5 (10.Be2 Be6).
As <witchetty grub> points out, 22.Rxf6 wins on the spot, and ends in a forced mate:
22...Kxf6 23.Qf4+ Ke6 24.Re1+ Kd7 25.Qf7+ Kd8 26.Bf4 Rc8 27.Qf6+ Kd7 28.Qg7+ Kd8 29.Qxh8+ Kd7 30.Qg7+ Kd8 31.Qf6+ Kd7 32.Qe6+ Kd8 33.Qe8#
22...Kxf6 23.Qf4+ Qf5 24.Qxd4+ Ke7 25.Qd6+ Kf7 26.Qc7+ Kf6 27.Qg7+ Ke6 28.Qd7+ Kf6 29.Rd6+ Ke5 30.Qe7+ Qe6 31.Qe6#
22...Kxf6 23.Qf4+ Ke7 24.Qc7+ Kf6 25.Qg7+ Ke6 26.Re1+ Kd5 27.Qf7+ Kd6 28.Kd6 Qe6#
If Black declines the exchange sacrifice with 22...Ke7, White remains a piece ahead and continues with a mating attack.
23.Rxf6 wins faster than the text (23.Qf4) but more slowly than if it had been played a move earlier.