Top surface scarring even with Z hop
Z-Hops only occur when the slicer is retracting Filament automatically (i.e. when Cura detects a move between parts/around outer walls where stringing would be a problem).

In your end G-Code, you do retract your filament, but manually. This means that Cura does not add the Z-Hop code.

Solution:
Add this before your G28 X0 Y0 command:

G91   ;Change Positioning to relative
G1 Z5 ;Move head up by 5mm (or bed down, depending on your machine)


The G91 command is needed because otherwise you wold need to provide an absolute Z position which is guaranteed to be above your last layer (so you would either need to set the height to the top of your build volume (takes ages to move the head there) or to adjust the height for each printed part (annoying)).

Documentation for the G91 command: http://marlinfw.org/docs/gcode/G091.html

Manual for Z-Hop and other travel moves in Cura: https://ultimaker.com/en/resources/52507-travel

Edit:

Note that this is only a good idea if MAX_SOFTWARE_ENDSTOPS are enabled in your Marlin configuration.h. Otherwise, the head could move ABOVE the maximum Z height (zMax) if the print height h &gt;= zMax -5mm.

Thanks to @0scar for mentioning this!