GPS will generally give very accurate speed readings, though by definition, it displays an average spped over a short period of time. So it will under-read when increasing speed, and over-read when slowing down. It is also subject to various errors from time to time, which will affect the reading, especially when the signals are weak, or the the geometry of available satellites give rise to significant errors. These errors have become significantly reduced since Selective Availability was switched off in the late 90s.
I have yet to see a car speedometer which does anything but over-read by some 2 - 10%. However car speedometers are usually very consistent at given speeds, over time.
So the best approach could be to calibrate a car speedometer at various speeds when at a steady speed using GPS, then use this knowledge of the error to derive an accurate speed in any situation (much like a deviation card).