Language support in modern Vim/NeoVim typically involves using an LSP server that is able to parse/interpret/compile your code base and provide your editor with access to semantic elements such as functions, classes, variables, types, etc.
For Scala, you might want to look into Metals, which is an LSP implementation for Scala. (There are other implementations of LSPs for Scala, you might consider researching and comparing them to choose the one that suits you best.)
Metals has comprehensive documentation, including a guide to set up Vim/NeoVim support for it.
Here you'll find again you have implementation choices between LSP clients for Vim/NeoVim. The Metals docs suggests two options, one is based on the native LSP client shipped with NeoVim (this is a NeoVim only option) or using coc.nvim (Conqueror of Completion), which works on both Vim and NeoVim (even though the plug-in uses ".nvim" in its name.) Adopting coc.nvim is not a bad idea, even if you're in NeoVim, it will give you many features typically found in modern IDEs such as VSCode, and should provide you with a very featureful experience out of the box.
Setting up all these components and their dependencies might be a bit tricky! Metals depends on a Java runtime (which you probably already have around and properly set up if you're doing Scala.) coc.nvim requires a working Node.js installation.
You also need to hook up all these components to each other, which typically works well during setup (many of these have been designed to work together), but it might be a headache to debug if you actually run into trouble with some part of it not working as expected... The documentation for both projects I mentioned is pretty comprehensive and complete, follow the guides and they'll hopefully lead you to a working setup. Your main interface will be through coc.nvim, so check out its documentation for actions related to navigation, such as "go to definition" which should take you to a function by its name.