If you have a good reason to add such a method for performance reasons (i.e. the method is typically called in performance critical code like inner loops), than I'd just go for it. It's not like your suggestion immediately makes the lib messy.
It's not something that's going to make a big difference. It mostly has an effect during the program's initialization, where add methods are called in some inner loops.
If it weren't for the ... parameters, I would have separate add and addAll methods anyways. It just seems strange to create an array and then execute a for-loop (within the method) to add one element.
If you use generics, there is type casting. The compiler just hides it away from you.
I wasn't aware that generics did type casting internally, but I vastly prefer using generics anyways. Either way, it was my understanding that neither generics nor type casting have any effect upon the bytecode, though I could be wrong about this.
Even if generics are slower, I would still use them because they produce compiler errors and/or warnings when I make the sorts of mistakes I often make.