I don't have real knowledge of why, but experience shows me that for visualizing or 3d printing, it's best to Discretize before applying region logic. You can improve RegionPlot somewhat with PlotPoints, but it becomes very time-expensive to get anything with tolerable accuracy.
The Discretize* functions also allow you to control accuracy, e.g. MaxCellMeasure option. This also adds time, but seems much less expensive than PlotPoints + RegionPlot.
If your surface is amenable to Graphics (like with Plot3D, ParametricPlot3D, or assembling graphics primitives), then DiscretizeGraphics is often even better than DiscretizeRegion.
Anyway, to demonstrate MaxCellMeasure, compare this:
RegionDifference[
DiscretizeRegion[Ball[{0, 0, 0}, r]],
DiscretizeRegion[Cylinder[{{0, 0, -5}, {0, 0, 5}}, Sqrt[r^2 - 9]]]]
to this:
RegionDifference[
DiscretizeRegion[Ball[{0, 0, 0}, r], MaxCellMeasure -> .005],
DiscretizeRegion[Cylinder[{{0, 0, -5}, {0, 0, 5}}, Sqrt[r^2 - 9]], MaxCellMeasure -> .005]]