I suppose it depends on what your definition of “best” is
because this works just fine, although it reallocates every time
julia> a = vcat(a[1:3], [10], a[4:5])
[1,2,3,10,4,5]
julia> a = vcat(a[1:1], a[3:6])
[1,3,10,4,5]
and will max out at double the space of a but GC will keep it at the length of a
whereas a double-linked-list will always take double the space as you need to store a link for each entry.
That said, I guess your MWE is simpler than your actual code.
The question in general really does boil down to how you’re using the datastructure. Are you reading much more often than writing? The Vector approach with insert! is probably a good fit. Are you writing more often than reading? Some kind of linked list may be more suitable, due to not having to move elements after the index you inserted, at the cost of losing cache coherence of neighboring elements.
It’s a tradeoff which is “best”, depending on your context.