Indeed, a reversal of the first level of the data is needed in ListPlot3D. The documentation page of GeoElevationData uses the construction ListPlot3D[Reversed[data], ...]
in its examples. This is a question of conventions used, and we always have to take into consideration which convention is being used by each function. Take for instance this data:
data = GeoElevationData["World"];
and compare the results of these two:
ArrayPlot[data]
ReliefPlot[data]
We see that different functions interpret the data differently, and we may need to reverse the data (with Reverse, or the option DataReversed, or the ScalingFunctions value "Reverse" as you did).
![enter image description here](https://community.wolfram.com//c/portal/getImageAttachment?filename=ScreenShot2023-02-18at14.21.06.png&userId=54190)