Follow path with offset.
When using follow path with fixed position one end is offset factor 0.0 the other 1.0 or for a cycle this is same. Half way is 0.5 etc.

Make a tower at origin, give it a follow path constraint, using the ellipse, with fixed position and no offset factor.

And oops, make sure that scale is applied on your ellipse AltS Scale ie it has unit scale and select follow curve on constraint to have the towers aligned to ellipse.

Now duplicate the mesh and move it around the ellipse using the offset factor...... being a scripter that's too much hard work, so have written a little script to do just this. Or via UI with Shift or Alt D for duplicate linked (same mesh) or unlinked respectively. And set the offset factor for each.
Little script, select tower, run script to make other distributed copies.
import bpy
from bpy import context
copies = 16
for i in range(1, copies): # copies - 1
tower = context.object.copy()
# comment following to have linked copies (same mesh)
tower.data = tower.data.copy() # an unlinked dupe (own mesh)
tower.constraints[0].offset_factor = i / copies
context.collection.objects.link(tower)
A bonus here is can easily move the goal posts, in case they are not all to be equally spaced around the ellipse by adjusting the offset_factor to have them remain on the path. Picture in OP almost looks like it may 18 spots with the two pointy end towers removed. No doubt all details are well covered on the 'net. (Kudos too to J.K. Rowlings for her support of the IRC chat servers)
And I want to upload my image but I don't know how to... ; ;
– Hana Apr 14 '21 at 11:00