I really like this paper which has a clear and simple reference counting system for a functional language, which ends up being surprisingly performant.
https://microsoft.com/en-us/research/uploads/prod/2020/11/perceus-tr-v1.pdf
The key point is that it is fairly easy for the programmer to anticipate when memory will be freed and then immediately refused, allowing for code that effectively mutates memory in place.
For example if you say;
X = f(10)
Y = f(X)
Then you know (assuming it fits) that Y will take the place of X in memory.