When you "pass by reference" you are really passing a copy of the reference, so setting that reference to point to another object (or null) won't affect the original reference. However if you change properties on the object by dereferencing your copy of the pointer, those changes will be seen by the caller.
If you wanted to truly pass by reference and cause your kill method to work, you could add the ref keyword:
public void Kill(ref Person p)
{
p = null;
}