Why does FixedUpdate work when Update() doesn't?

Hello. Quick preface, I read through the API on Update and FixedUpdate, but I didn’t fully understand why this changed my code… Basically, I wrote a code for a dialogue script which checks the distance via raycast and if its touching the Face collider, and initiates the chat if the player is close enough and all parameters are met. Let me be clear, this script works perfectly using FixedUpdate, but when using Update(), it doesn’t every time, almost as if there is lag and it only works some of the time…Can someone explain why?

	if(Physics.Raycast(raycast.transform.position,(forward),out hit)){
			print ("raycast hit");
			Distance = hit.distance;
			print (Distance + " " + hit.collider.gameObject.name);
			if(Distance < 3 && hit.collider.gameObject.name == "Face" && Input.GetKeyDown ("e") && chat_on != true){
			print ("E was pressed and chat is not true");
			NPCS = GameObject.FindGameObjectsWithTag ("NPC");
			foreach (GameObject obj in NPCS) {
				objPos = obj.transform.position;
				mag = (objPos - player.transform.position).sqrMagnitude;
				if(nearestNPC == null || (nearestNPC.transform.position - player.transform.position).sqrMagnitude > mag){
					print ("the mag calcs");
					nearestNPC = obj;
				}
			}

Physics and Collision operations occur during FixedUpdate(). Since you are calling Physics.Raycast (which checks for colliders along a given Ray), you will often want to use them in FixedUpdate(). Collider detection should still be fine in other places (like Update), but any raycasting that result in a manipulation of physics objects should be done during FixedUpdate() calls or yield instructions.

edit: clarifying.

I believe this is incorrect. Physics.Raycast should only be used in FixedUpdate if you are also altering the forces on some rigidibody as a result.
Could someone confirm?