Are there better ways to pass variables from one gameobject to another than find, getcomponent?

Seems like using find takes up unnecessary processing during runtime - is there a way to declare the variable directly?

GetComponent isn't that big a deal; only worry about it if you're doing it frequently every frame. Find is much worse, but generally you don't need it, depending on what you're doing. Use references with public variables and so on (see Petroz's answer for what I mean by "and so on"). If you use Find, just do it once and cache the result (same for GetComponent if you use it to get the same component frequently).

Eric is right but I'd just like to add, this the price of doing business with a component based architecture. I think it's a pretty small price to pay to never have to deal with deep inheritence heirachies and the dreaded diamond. As Eric said you only have to search once and cache the result locally.

Another way to avoid it is to use dependency injection with dynamic object creation. In other words use AddComponent to create the script component and then initialize the script immediately after creation so it is ready to go without any lookups.

Enemy enemy = gameObject.AddComponent<Enemy>;
enemy.init(player);

Here I have created the script component 'enemy' at run-time and initialized it with 'player' so the script doesn't not need to have a Find or GetComponent to locate the player.