Qual é a “facilidade de implementação” que você se refere que o Vector tem em relação ao ArrayList?
Até onde eu sei, ambos tem os mesmos métodos de acesso (implementam a mesma interface). O Vector ainda tem a desvantagem de ter métodos com funções redundantes, devido a herança histórica (addElement e add, por exemplo) e, se um desses métodos forem usados, você terá problemas se precisar altera-lo um qualquer outra coleção baseada na interface List, como a LinkedList. Os métodos históricos ainda te dão o inconveniente de ficar poluindo a lista de auto-completion da sua IDE.
Além disso, usar um array comum é realmente mais rápido desde que você implemente algoritmos mais eficientes do que os que estão dentro da classe ArrayList, o que geralmente não acontece. Pegue por exemplo o Collections.sort, que usa um algoritmo muito mais eficiente do que um programador normal, sem muita dedicação, faria. E, mesmo que esse programador fizesse, teria que manter o código depois. Claro, se sua aplicação tiver performance crítica, e se depois de rodar um profiler você notar que o problema é a implementação do ArrayList (e não algum algoritmo seu que usa o ArrayList), certamente você estará disposto a pagar esse preço.
O caso que você citou (inserção e remoção de itens) é um exemplo disso. A falha não estaria na implementação do ArrayList, mas no uso da coleção errada. Se sua aplicação faz muita inserção e remoção, é provável que você se beneficie substituindo a implementação por um LinkedList. O que será fácil se você usar corretamente a interface List e não os métodos históricos de Vector. Se os índices não interessam para você, então seria melhor ainda usar um Set, que pode inclusive ser ordenado e tem uma ótima performance para adição, remoção e pesquisa de itens. O tal “efeito colateral” que você citou é uma característica da coleção e, aliás, é o que motiva um List a ser um List.
Ainda assim, se você estiver numa das raríssimas situações em que um List precisa ser thread-safe, é provável que seja melhor usar uma das coleções do pacote java.util.concurrent, e não o Vector. Nesse caso, ter utilizado somente os métodos da interface List - e não os métodos históricos do Vector - vai ser novamente fundamental para uma migração fácil.