While, like Joseph, I would ordinarily choose the more straightforward path that \url provides, I can see that that approach doesn't solve your stated problem. In which case, should you really want to to typeset your URLs the way that you proposed, this code should get you there:
\documentclass{article}
\usepackage{hyperref}
\usepackage{xstring}
\newcommand*\safetilde[1]{%
\begingroup%
\catcode`\~11%
\StrSubstitute{#1}{~}{\raise-0.85ex\hbox{\~{}}}%
% -OR- LOW TILDE (faked low tilde - code lifted from url.sty)
% \makeatletter
% \StrSubstitute{#1}{~}{{\raise.45ex\hbox{\m@th$\scriptstyle\sim$}}}%
% \makeatother
\endgroup%
}
\newcommand{\serifurl}[2]{%
\textsf{\href{#1://#2}{\safetilde{#2}}}%
}
\begin{document}
\serifurl{http}{www.middle-man.net/~alice/os~car/bob~}
\end{document}
EXPLANATION:
\safetilde locally sets tildes to normal (letter) category code before converting any tildes in its argument into \~{}'s using \StrSubstitute from the xstring package. Since these characters tend to be set a little high from the baseline, we lower them a small negative \raise amount. Alternatively comment the uncommented \StrSubstitute line and uncommented the following 4 commented lines. This code typesets any tildes using math \sim symbols instead (this code lifted from url.sty).