Learning is never a unfruitful effort. If you consider X86 has instructions to count leading zeros, calculate a 32bit CRC, instruction to let you specifically control the "rounding mode" from floating point to integer. Then there are definitely common cases for using these instructions. The rounding one alone can save alot extra math that would be done to do the equivalant in C. And a CRC is a non trival function that has applications in everything from network protocols to file formats. Leading zeros is a useful way to approximate a log based 2 function, and typically when I used the log base 2 function all I was trying to do was calculate the bit size and had to round it anyway.
Assembly can be the shortest answer to certain problems, and C code to do things like counting leading zeros or calculating a CRC is significantly more complex than issueing a single instruction to do the same thing.
Also you indicate other applications BESIDES WEB DEVELOPMENT, (For all those folks who keep saying you don't need it for web development, please read the question.) OS development, Linux Kernel Hacking, Driver Development, Bootloaders, and Compiler Design definitely have need of ASM coders. Apart from that, GPU code is very size/speed critical and has practical "ASM" like programming concerns, IBM's Cell processors used in Blade servers for high performance computing and simulation work could use hand coded assembly better than most systems. Library development is typically something where you want an optimal solution so the end user (programmer) doesn't need to worry about those details so again some assembly may be required.
As far as learning Assembly, get a book such as the "Art of Assembly." One of the exercises you could do once you have a handle on the basics is to write C functions, and then try to implement the same functions using assembly, compare the compiled results to the hand coded version to see where you could optimize your code. Most compilers will give you a "don't delete generated assembly" type option so you can retain the file. You can also start with compiler generated assembly and make modifications from there to attempt to improve performance or perform operations which are not easily represented in C. The point being looking at assembly and working out how it corresponds to your C code will aid in your understanding.
One clear example of assembly that has no C construct to represent it is an atomic operations such as "test and set" operation, used for mutitasking primitive such as semaphores. And before someone says "but I can do that from C," there maybe library calls to do so, or compiler extentions/processor intrincics, but at some level someone has to put assembly code down on paper (or monitor in this case) to perform these operations.