Graphical part of hardcoded bullets (huge amount of them)

I have universal and extremely efficient bullet system, but there is one moment I don’t know how to handle: how to make them visible.
I’ve tried several ways to render bullet trails, but all of them were really slow.

For example there was a method where every bullet controlling particle system (beam type), but when there was 1000 bullets it was taking 1 ms to simulate and ~50 ms to render. This is because of huge amount of drawcalls, so even if every bullet will carry static mesh, it will be slightly faster, but still laggy.

So I need to create custom particle system (or something like this) to draw trails in one drawcall (at least not in thousand). But how can I do it?

How can I optimize bullet rendering so even 1000 of bullets will work on pretty weak machines?

I don’t even can imagine how particle systems work, but I know, that 1000 particles on CPU still not a problem - that what I need.

P.S. Bullets are not an actors, the are simple classes. These classes are controlled by single actor (controller actually) in the scene, keep it in mind, because the only link between Bullets and world is this actor… just in case.