You only have a small error in your parameters.
const tube = new THREE.TubeGeometry(curve, 64, radius, 64);
new THREE.CircleGeometry(radius, 48) // <===
So it’s perfect.
It’s a good solution.
UPDATE
Rejoiced too soon.
The segments do shift when twisted!
This is probably a bit more complicated and similar to my problem.
Inaccurate adjustment when cylinder is deformed
You can find a pdf reading there if you want to know more.