Конечно, нет проблем с производительностью или тому подобного, которые следует учитывать, поэтому все сводится к семантике.
Ожидаете ли вы, что вызывающий ваш метод будет иметь под рукой массив Foo? Тогда используйте версию Foo []. Используйте вариант varargs, чтобы подчеркнуть возможность наличия «множества» Foo вместо массива.
Классическим примером для varargs является строковый формат (в C #, как его называют в Java):
string Format(string formatString, object... args)
Здесь вы ожидаете, что аргументы будут разных типов, поэтому наличие массива аргументов было бы довольно необычным, отсюда и вариант varargs.
С другой стороны что-то вроде
string Join(string[] substrings, char concatenationCharacter)
использование массива совершенно разумно.
Также обратите внимание, что у вас может быть несколько параметров массива и только один параметр vararg в конце списка параметров.