The implicit return is perhaps the most dubious of them. I don't mind it for simple functions, but they are not so good in anything large and with multiple return sites. Even more so when developers choose to implicitly return 4 chained method calls inside a closure with else cases.
But the rest aren't really sins, they are mostly new or different concepts or ways to do something. And if there is a sin, it's largely because the language itself has a complexity larger than others.
Taking my own examples here, lambdas are just fine, but the move semantics are cumbersome to deal with. But we need to do it some way, to indicate that a value is actually being moved into the closure. Maybe there are better ways and they make into the language in the future.
Conditional values and let statements and such is a good consequence of Rusts design choice with returning Results or Option types. Just because it's different doesn't make it a sin. Just takes time to learn the right way. I think most come from an exception based language, and that has a differnet code flow than what Rust has.
Lifetimes are hard though, and I feel a lot of the introduction is made excessively hard with the simple naming. It's as of every programming tutorial used single letter variable names. Lifetimes isn't something I'm that good with either, mostly because I haven't had to use that complexity yet.
I'm going to second the ffmpeg answers, they do the job but won't be completely accurate to timestamps due to cutting at key frames. That's how you persevere original quality though, and it's fastest.
If you need to reencode to fit a target size as well, there exists tools for that too. I made my own for cutting shadowplay recordings by selecting start and stop points in the video and encoding them to fit the discord 8MB limit back in the day. My version is not exactly user friendly to get going though, and not updated for the last 5 years or so. Should still work though.