Já existem respostas sólidas aqui - eu só quero falar com mais uma maneira comum de ver cores de vértice usadas:
Variando as cores do objeto (ou outros atributos) em uma única chamada de lote / sorteio.
Você verá isso usado na renderização de sistemas de partículas, texto e sprites em lotes (geralmente em relevo).
Imagine que você tenha um emissor de partículas que gera partículas com uma cor inicial aleatória ou que desbota até 0 alfa durante a vida útil das partículas. Se usarmos uniformes shader para enviar esses dados de cores, precisaremos desenhar cada partícula de cor diferente em sua própria chamada de desenho, tornando o sistema de partículas muito mais caro. Em vez disso, podemos agrupar essas cores nos dados de vértice das partículas e renderizar todo o lote em uma única chamada.
O Unity parece usar essa técnica para variação de cores de partículas, bem como para colorir caracteres individuais em um TextMesh ou Sprites renderizados juntos em um lote.
Acredito que você pode fazer algo semelhante ao instanciamento da geometria, mas não sei como os dois se comparam no desempenho. É possível que hoje fazer esse tipo de ajuste instanciado através de cores de vértice seja mais um obstáculo para suportar hardware pré-OpenGL 3.1 / DX9 como alguns dispositivos móveis, em vez de uma prática recomendada para PCs modernos. Gostaria de receber comentários de pessoas que fizeram mais ajustes de desempenho com lotes e instanciamento para ajudar a esclarecer se essas técnicas substituíram as cores dos vértices para esse fim. :)