First, notice how most American speakers also rhyme Harold and herald
with Gerald, caroled, imperiled, and double-barreled. This happens
because for most speakers of American English, stressed vowels before R
lose the tense–lax distinction that exists in words with those vowels that
don't have an R following them.
So even though the vowel phonemes in heck and hat and hate all
clearly differ from one another, as soon as you go replacing the final
consonant with R in each word, those vowels suddenly stop contrasting. Just which final vowel those all collapse into varies by speaker and
listener. Some have only a tense vowel there, which yields [ˈheɹəld];
others have only a lax vowel instead, which yields [ˈhɛɹəld].
The same forces are at work in hero as to whether the vowel before the R
is the tense one of peek or the lax one of pick. Under tense–lax
neutralization, it simply doesn't matter because those two phonemes are no
longer distinguished in that position.
See the Wikipedia article on English-language vowel changes before
historic
/r/
for far more than everything you ever wanted to know about this truly voluminously lengthy area of study.
Second, the vowel in those two words’ second syllables is fully neutralized
into a schwa because it isn’t in a stressed syllable. It doesn’t matter
whether if stressed it would have been the vowel from called or the vowel
from old; it’s always just schwa when unstressed.
Finally, I can’t tell you why your writer claimed haul and hall are
pronounced differently, since as far as a I know, both are [hɔl]. The one
that’s different from haul is howl, since the latter rhymes with owl.