I am not sure if you can specify all punctuations except ' within a regexp the way you've done. I would check for alphanumerics + ' + space with negation:
gsub("[^'[:lower:] ]", "", str2) # per Joshua's comment
# [1] "this doesn't not have an apostrophe"