The checker is conservative on purpose
The borrow checker proves safety, so anything it cannot prove it refuses. That makes it sound but incomplete: no unsafe program is accepted, and some safe ones are rejected.
The lesson What Undecidability Costs Real Tools explains why this is not a gap to be closed. Rice's theorem says every non-trivial semantic property is undecidable, so an analyser must choose which way to be wrong. The borrow checker chose to reject rather than to miss.
Which means a language built only on it would be unable to express things that are genuinely fine. A doubly linked list, a cache with shared entries, a call into a C library: all safe in fact, none provable by the rule.
So Rust provides escape hatches, and the interesting part is that they are graded. Each gives up a different amount of checking, and reaching for the strongest one when a weaker suffices is the common error.
The order below is the order to try them in.

