Esta respuesta se ha copiado de mi respuesta a otra pregunta. Pero el OP cambió la pregunta y, por lo tanto, esta respuesta se volvió menos relevante. En mi humilde opinión, es más relevante para esta pregunta así que aquí va:
Piense en la diferencia entre el lienzo y SVG como la diferencia entr Photoshop e Illustrator (o Gimp e Inkscape para la gente que OSS). Uno trata con bitmaps y el otro arte vectorial.
Con lienzo, ya que está dibujando en mapa de bits, puede manchar, desenfocar, grabar, esquivar las imágenes con facilidad. Pero dado que es un mapa de bits, no es fácil trazar una línea y luego decidir cambiar la posición de la línea. Debe eliminar la línea anterior y luego dibujar una nueva línea.
Con svg, ya que está dibujando vectores, puede mover, escalar, rotar, cambiar de posición y voltear sus dibujos fácilmente. Pero dado que se trata de vectores, no es posible difuminar fácilmente los bordes de acuerdo con el grosor de la línea ni fusionar un círculo rojo en un cuadrado azul. Debe simular la borrosidad dibujando polígonos intermedios entre los objetos.
A veces su caso de uso se superpone. Por ejemplo, muchas personas usan lienzos para hacer dibujos de líneas simples y realizar un seguimiento de los objetos como estructuras de datos en javascript. Pero realmente, ambos sirven para diferentes propósitos. Si intentas implementar un dibujo vectorial de propósito general en javascript puro en el lienzo, dudo que seas más rápido que usar svg, que probablemente se implemente en C.
RaphaelJS no es * solo * SVG, y por lo tanto funcionará en navegadores (es decir, IE) que no tienen Canvas (aunque hay un emulador Canvas para IE). – Ken