Refactoring is indeed a problem. I try to use an IDE for that (for java I don't use vim anymore; it's complete overkill). If you use python or go, you can find some stuff out there, but sadly vim is not made for this.
I've never really had a problem with goto method definition with ctags, and I've used that with multiple languages. ctags is usually relatively fast generating the tags, and you could probably set up so that it generates it each X seconds if you wanted.
For the project wide search, ctrlP has served me well, although the fuzzy completion is far from good (command-t is way better at that), so I would probably recommend the second one if your project is large.
Regarding switching projects, I've been using tmux for quite some time and it's a blessing. I could not imagine someone spending a lot of time in the terminal with vim and not using tmux or another terminal multiplexer. tmux is for me as important as vim itself. It makes a big difference. I have different sessions for different projects .
You have probably heard about youcompleteme. It's not amazing (doesn't come close to intellij), but it works and it's free, so the last thing I will do is complain :)
I'm not sure I understand the move back/forward in history. Do you mean undoing just some specific selected code?
vim is far from perfect. The more I use other tools, the more I realize it's limited in a lot of ways, but unfortunately when I try to use other editors, I find too many shortcomings too, so right now for me vim is the best I have =)