all those options are fine it just depends on your game,
i use UObjects myself, you can add world context to them in c++ to have any functionality like LineTrace, or just call the trace on a manager class
if you dont wont to do that actor components, feel weird but actually work and are far more efficient than spawning.
that said spawning is still fine too, or better yet use ObjectPooling, the advantages to actors is you can add say a particle effect or something
if you want to map it to a function library or some manager class i use GameplayTags instead of strings