I'd use etags because it comes with Emacs and is what the default implementation of M-. targets.
Given a C project you can use etags *.c *.h to generate the TAGS file in that directory and select it when prompted by M-.. Some C projects already provide a Makefile target for that, for example you can run make tags in the Emacs sources to generate them for the ...
You can lengthen the timeout using the lsp-response-timeout option: https://emacs-lsp.github.io/lsp-mode/page/settings/mode/#lsp-response-timeout
Of course, what you really want to do is make gopls faster. Probably not much you can configure in Emacs to do that.
As mentioned in the comments, a workaround for this issue is to start emacs on a folder (or on nothing) instead of on a single source file.
This was discussed for VScode with gopls as backend here: https://stackoverflow.com/a/49977881/497180
s is bound to a new function that was recently added, and indeed it appears to be non–functional. I took a look at the source code, and it does attempt to pull file and line number from the stack frame, but none of the stack frames have any file and line number information :)
It then tries to run hook functions, but the list of hook functions is empty. Those ...
Org mode uses the standard Emacs minibuffer completion mechanism for tags: whenever a tag is expected (e.g. at the C-c a m prompt), you can type TAB to get a completion list. You can click on a completion to choose it (or, without a mouse, switch to the completion buffer, navigate to the completion of interest and press RET); or you can narrow down the ...
That is the correct way to do it. Your only other approach is to use something like ivy or helm, which when you type C-c a m will offer you a list of tags that you can use completion on to narrow down.