Quicksort is fast, but only if you implement it very carefully.
Make sure that an array that is already sorted in correct or reverse order will be sorted quickly. This is a very common case, when an array is sorted twice. There are implementations that check first whether your array starts or ends in a subarray that is sorted in ascending or descending order. If the elements are random, then this will take very little time. If an array is sorted or the concatenation of two sorted arrays, then you can sort it in linear time. If you have n sorted items followed by fewer than O (n / log n) random items, you can sort it in linear time.
Really bad implementations will always choose the first or last element as the pivot, which turns Quicksort into Big-Theta(n^2) if the array is sorted; picking a random element as the pivot will help enormously.
Make sure that the implementation is fast if all or many elements are equal. With k equal elements, bad implementations will take k^2 operations for those elements, so if more than O (sqrt (n log n)) elements are equal, you won't be sorting in O (n log n) anymore.
Fine tuning: Consider the cost of a comparison and of moving elements. You can't avoid n log n comparisons, but you can sort with O (n) moves. If moving is substantially slower than comparing, you can sort an array of array indexes, get the exact order of indices for the correctly sorted array, and permute the elements. This may not be cache friendly, and uses extra storage for indices, so you may only want to do it if a subarray that you are partitioning fits into a cache.
Easier fine tuning: If moving elements is a lot more expensive than comparing, but not excessively: You reduce the number of moves by not picking the median as the pivot, but a bit of the median. So what you can do is pick 4 random elements and use the 2nd smallest or 2nd largest as the pivot. The number of comparisons grows, but the number of moves goes down.
Partial sorting: Sorting may be needed to display items in sorted order. But if you have tons of items, you can't display them all. You can put a million items into buckets according to the first letter, and if you want to display say items 330,000 to 330,025 you check which bucket they are in, and sort the one bucket containing the items you want. This can make things ten times faster.
Two cases where Quicksort is not the fastest by far: 1. Your array was sorted, but its values change slowly over time. Say weather stations sorted by temperature. One minute later the temperatures have changed slightly. Bubblesort might be fastest. 2. Your array was sorted, but a small number of random items has been changed, sometimes massively changed. If you have n items of which k are changed, you can sort them in O (n + k log k) which is linear if k = O (n / log n).