As Jesko says, already for line bundles there are problems. The easiest example is probably $\mathscr{O}_{\mathbf{P}^n_k}(1)$ and its dual $\mathscr O(-1)$. The first has lots of nonzero global sections, but the second has none; they can't even be non-canonically isomorphic.
One interesting thing to think about, which I saw pointed out in a book review by Kollár, is that in differential geometry one can choose a metric on any vector bundle and use that to identify $E \simeq E^\vee$. So this is a good example of how algebraic geometry differs.
$\def\H{{\mathcal Hom}}\def\HH{{\operatorname{Hom}}}$Everything you wrote seems correct for the locally free case. Though its easy to overlook subtle things with these type of arguments, it looks good to me.
For the second I believe there is a natural map $f^*\H_Y(E,F) \to \H_X(f^*E,f^*F)$. I will actually define a map $\H_Y(E,F) \to f_*\H_X(f^*E, f^*F)$ and use the adjunction with $f^*$ to get the required map.
Let $U \subseteq Y$ be open. Then $\H_Y(E,F)(U) = \HH(E|_U,F|_U)$ and $f_*\H_X(f^*E,F^*F)(U) = \HH(f^*E|_{f^{-1}(U)}, f^*F|_{f^{-1}(U)})$. Then we note that
$$
f^*E|_{f^{-1}(U)} = f|_{f^{-1}(U)}^*\left(E|_{f^{-1}(U)}\right)
$$
and $f^*|_{f^{-1}(U)}$ is a functor from sheaves of $\mathcal{O}_U$ modules to $\mathcal{O}_{f^{-1}(U)}$ modules. Thus we get a natural map of sheaves of modules from $U$ from functoriality:
$$
\HH(E|_U, F|_U) \to \HH\left(f|_{f^{-1}(U)}^*\left(E|_{f^{-1}(U)}\right), f|_{f^{-1}(U)}^*\left(F|_{f^{-1}(U)}\right)\right) = \HH(f^*E|_{f^{-1}(U)}, f^*F|_{f^{-1}(U)}).
$$
Everything is suitably natural enough that it should commute with the restriction maps for inclusions $V \subset U$ giving a map of sheaves $\H_Y(E,F) \to f_*\H_X(f^*E, f^*F)$.
Now that we have the required map $f^*\H_Y(E,F) \to \H_X(f^*E,f^*F)$, I think we need $X$ and $Y$ to be schemes not just locally ringed spaces. Then we can reduce to checking that this is an isomorphism on affine covers in which case it reduces to the isomorphism from commutative algebra. Without having $X$ and $Y$ be schemes I don't think we can make the argument work because $\H$ does not commute with taking stalks so we can't just check it on local rings.
EDIT: See comments below, apparently the argument does work on any ringed space as long as $E$ is of finite presentation.
Best Answer
For these kinds of questions, if you can see how to establish an isomorphism stalkwise, the key thing you need to do to promote this to a complete proof is to construct a morphism between the sheaves that you are trying to prove are isomorphic.
Once you have a morphism, in order to check that it is an isomorphism, you can work on stalks; and then hopefully the induced morphism equals to isomorphism you've already constructed. (If what you've done is sufficiently natural, then this should work out). In this particular case, there's likely an argument that avoids working with stalks altogether, but since you've already thought about them, it makes sense to incorporate them into your argument; and in any case, the strategy I'm suggesting is a very common one.
So, you want a natural morphism $f^*(\mathscr E^{\vee}) \to (f^*\mathscr E)^{\vee}$ (intuiting the correct direction in which to construct the desired morphism is one of the subtleties of this proof strategy, but can normally done by a bit of trial-and-error).
That is, we need a pairing $$f^*(\mathscr E^{\vee}) \times f^*\mathscr E \to \mathscr O_X,$$ or equivalently a morphism $$f^*(\mathscr E^{\vee}) \otimes_{\mathcal O_X} f^*\mathscr E \to \mathscr O_X.$$ (Judicious unwinding of definitions, as in this case, where I've unwound the definition of $(f^*\mathscr E)^{\vee})$, is also a typical aspect of such an argument.)
But just using properties of pull-backs and tensor products, you can see that there is a canonical isomorphism $$f^*\mathscr E^{\vee}\otimes_{\mathscr O_X} f^*\mathscr E \cong f^*(\mathscr E^{\vee} \otimes_{\mathscr O_Y} \mathscr E).$$ So the desired morphism can be obtained by pulling back the canonical morphism $$\mathscr E^{\vee} \otimes_{\mathscr O_Y} \mathscr E \to \mathscr O_Y$$ via $f$.
Now that you have a morphism from $f^*(\mathscr E^{\vee})$ to $(f^*\mathscr E)^{\vee}$, you can pass to stalks to check it is an isomorphism. But on stalks, it will surely agree with the isomorphism you've already discovered (since this is the only natural isomorphism in this context).