I'd use ooalign rather than mathop. This is about as close as you can go if you want the - aligned with the bar on + If you want the - to be raised more you could \smash it. I also introduced an optional parameter that allows you to give teh letter before the vowel so that it can measure if there would have been a kern, If so it kerns by half that amount (to take account of the bold being wider anyway).

\documentclass{article}
\parindent0pt
\def\pl#1{\oalign{\smash{#1}\cr\hfil$\scriptscriptstyle+$\hfil\cr}}
\def\mi#1{\oalign{\smash{#1}\cr\hfil$\scriptscriptstyle-$\hfil\cr}}
\newcommand\bv[2][]{%
\ifx\relax#1\relax\textbf{#2}%
\else
\setbox0\hbox{#1#2}%
\setbox2\hbox{#1\textbf{#2}}%
#1\kern\dimexpr(\wd0-\wd2)/2\relax\textbf{#2}%
\fi}
\begin{document}
Bl\textbf{e}ssed in\bv[d]{e}ed \pl{is} the m\bv{a}n\\*
who \bv[f]{o}llows not the c\textbf{o}unsel \mi{of} \pl{the} \bv[w]{i}c\mi{ked,}
\end{document}
Version as requested with extra space argument
\documentclass{article}
\parindent0pt
\parskip\baselineskip
\makeatletter
\def\pl#1{\oalign{\smash{#1}\cr\hfil$\scriptscriptstyle+$\hfil\cr}}
\def\mi#1{\oalign{\smash{#1}\cr\hfil$\scriptscriptstyle-$\hfil\cr}}
\newcommand\bv[1][]{\def\tmp{#1}\@bv}
\newcommand\@bv[2][\z@]{%
\ifx\tmp\@empty
\textbf{#2}%
\else
\setbox0\hbox{\tmp#2}%
\setbox2\hbox{\tmp\textbf{#2}}%
\tmp\kern\dimexpr(\wd0-\wd2)/2-#1\relax\textbf{#2}%
\fi}
\makeatother
\begin{document}
Bl\textbf{e}ssed in\bv[d]{e}ed \pl{is} the m\bv{a}n\\*
who \bv[f]{o}llows not the c\textbf{o}unsel \mi{of} \pl{the} \bv[w]{i}c\mi{ked,}
Bl\textbf{e}ssed in\bv[d]{e}ed \pl{is} the m\bv{a}n\\*
who \bv[f][-2pt]{o}llows not the c\textbf{o}unsel \mi{of} \pl{the} \bv[w]{i}c\mi{ked,}
Bl\textbf{e}ssed in\bv[d]{e}ed \pl{is} the m\bv{a}n\\*
who \bv[f][2pt]{o}llows not the c\textbf{o}unsel \mi{of} \pl{the} \bv[w]{i}c\mi{ked,}
\end{document}

For thing letters the - might be wider than the letter forcing a space so hide most of the width by adding ! either side. Also in teh case of aw there is a kern between the letters normally that is lost, rather than add another optional argument for every possible combination this defines a \kernfix command so \kernfix a w inserts the kern that would have been between a and w, This results in

\documentclass{article}
\parindent0pt
\parskip\baselineskip
\makeatletter
\def\pl#1{\oalign{\smash{#1}\cr\hfil$\scriptscriptstyle\!+\!$\hfil\cr}}
\def\mi#1{\oalign{\smash{#1}\cr\hfil$\scriptscriptstyle\!-\!$\hfil\cr}}
\newcommand\bv[1][]{\def\tmp{#1}\@bv}
\newcommand\@bv[2][\z@]{%
\typeout{[[\tmp]][[#1]][[#2]]}%
\ifx\tmp\@empty
\textbf{#2}%
\else
\setbox0\hbox{\tmp#2}%
\setbox2\hbox{\tmp\textbf{#2}}%
\tmp\kern\dimexpr(\wd0-\wd2)/2-#1\relax\textbf{#2}%
\fi}
\def\kernfix#1#2{%
\setbox0\hbox{#1\kern\z@#2}%
\setbox2\hbox{#1#2}%
\kern\dimexpr\wd2-\wd0\relax}
\makeatother
\begin{document}
Bl\textbf{e}ssed in\bv[d]{e}ed \pl{is} the m\bv{a}n\\*
who \bv[f]{o}llows not the c\textbf{o}unsel \mi{of} \pl{the} \bv[w]{i}c\mi{ked,}
aaa aw a\kern0pt w \mi{a}\pl{\bv[w]{a}y}! bbb
aaa aw a\kern0pt w \mi{a}\kernfix{a}{w}\pl{\bv[w]{a}y}! bbb
Bl\textbf{e}ssed in\bv[d]{e}ed \pl{is} the m\bv{a}n\\*
who \bv[f][-2pt]{o}llows not the c\textbf{o}unsel \mi{of} \pl{the} \bv[w]{i}c\mi{ked,}
Bl\textbf{e}ssed in\bv[d]{e}ed \pl{is} the m\bv{a}n\\*
who \bv[f][2pt]{o}llows not the c\textbf{o}unsel \mi{of} \pl{the} \bv[w]{i}c\mi{ked,}
\end{document}
To get even smaller fonts use
\def\pl#1{\oalign{\smash{#1}\cr\hfil\fontsize{2pt}{2pt}\fontencoding{T1}\selectfont+\hfil\cr}}
\def\mi#1{\oalign{\smash{#1}\cr\hfil\fontsize{2pt}{2pt}\fontencoding{OMS}\selectfont\char0\hfil\cr}}

If you are using the default cm fonts you need to add
\RequirePackage{fix-cm}
before \documentclass to allow the fonts to scale that small.
+/-being closer to the text, or the spacing between the lines that need to be closer together, or both? – Werner May 03 '13 at 04:06