Based on my experience I believe there are lots of instances where the knowledge of assembler is very helpful (certainly a lot more than just "very few and very far between"). For example I often see horribly inefficient C++ programs written by people who don't understand when passing parameters by value is slower than passing by reference and when not. Without any basic understanding of the way passing arguments to a function is actually implemented it is probably quite difficult to write a good C++ program. This was just one example but I can provide a lot more.
It is true that these days virtual machines are becoming more and pore popular. But this doesn't remove the need to know how the computer operates. Virtual machine can be thought of as a type of a computer with its own assembler (called "bytecode" in JVM, i don't know how it is called in .NET). So for example failure to understand how JVM operates will result in bad Java code (many Java programmers don't know how to use a proper object allocation strategy to greatly improve the speed of Java programs and its memory usage, etc, etc.).