Golfception arrives
Python 3.6, 250 bytes
Saved 4 bytes thanks to isaacg, and 1 thanks to KoishoreRoy!
d=700 # Current distance
from random import*
r=randrange # Function that gets a random value in the range [0, input)
i=0 # Number of strokes
while d:
i+=1;x=r(20)<1 # x is False 95% of the time
# My justification for reusing this random value
# is that it's used once and only once, separate by if/elif
if d<10:d-=[d,d*.75][x] # We're within putting range; goes in if x is true; otherwise makes 75% progress
elif x:i+=1 # Goes in the water, add a stroke
elif d<250:
s=r(95);d-=[d,d*[.7+r(21)/100,.9*r(10)/100][s<15]][s>0]
# Only 95 because we already checked to see if it would go in the water
# 99% of the time (s>0), it doesn't go in
# 14% of the time (s<15), it makes 90-99% progress
# Otherwise, it makes 70-90% progress
else:d-=250+r(101) # Lose 250-350 yards
d=int(abs(d));print(f'{d}m')
print(f'Total hits {i}')
Try it online! (Uses Python 3.5 printing syntax at a cost of 6 bytes since TIO does not yet support Python 3.6.)
Perl 6, 212 bytes
my&p=(^*).pick;say 'Total hits ',(700,->\d{my \n=d>249??abs d-(p(20)??250+p
100!!0)!!d>9??d-(|((d*(70+p 21)div 100) xx 80),|((d*(90+p 10)div 100) xx
14),d,|(0 xx 5))[p 100]!!p(20)??d div 4!!0;"{n}m".say;n}...0)-1
&p
is a helper function that picks a random number from 0
to one less than its argument. The expression after 'Total hits '
is a lazily-constructed list that generates each element based on the previous element. The elements are printed as they are generated, which isn't very functional, but it is shorter than storing them in an intermediate array.