It depends on your data, as well as what you are trying to optimize for: speed, cost, precision, etc.
In many cases cheap methods like grepping and BM25 just are not going to work well, so semantic similarity is the best initial retriever/filter, followed by LLM-as-judge as a second filter/reranker if you need the precision.