Performance counter objects in general need two values sampled at 1 - 2 seconds apart to be able to give accurate readings .. although I hate the fact I'm using a thread delay here, I can't think of a simpler way - see the two lines in bold I've added to your code - see if that makes it more accurate
PerformanceCounter cpuCounter;
cpuCounter = new PerformanceCounter("Processor", "% Privileged Time", "_Total");
cpuCounter.NextValue();
System.Threading.Thread.Sleep(1000);
lbl_cpu_usage.Text = Convert.ToInt32(cpuCounter.NextValue()).ToString() + "%";
[edit] ref :
Performance Counter Value Retrieval[
^] [/edit]