Why do we need block hashes in blockchain? I believe there are around 3 types of overall hashes that we deal with in Bitcoin.


block hashes
Merkle tree hashes (makes transactions tamper proof by hashing them up to the Merkle root) 
public-private key hashes (used as part of the UTXO model to generate addresses derived from the public key)


I get the functionality of all hashes other than 1st.
Is it only there for reference ?? We could have used block height as block reference and traversal and added nonce in that for our POW requirement.
on functionality:

from Andreas book "Mastering Bitcoin", Chapter 7:


  The primary identifier of a block is its cryptographic hash, a digital
  fingerprint, made by hashing the block header twice through the SHA256
  algorithm. The resulting 32-byte hash is called the block hash but is
  more accurately the block header hash, because only the block header
  is used to compute it...


This block hash is a reference to a previous block hash, which connects this block to the previous block in the blockchain. 


  Is it only there for reference ??


no, it's a pointer to the previous block, so the chain can be established. As in the linked article:


  one can not simply create a block "isolated" from the blockchain
  and then just "insert" it in the blockchain to win the reward
  it's necessary that a previous block is known before a new valid one is created.
  
  using block height?


again from Andreas book:
A block’s block hash always identifies a single block uniquely. A block also always has a specific block height. However, it is not always the case that a specific block height can identify a single block. Rather, two or more blocks might compete for a single position in the blockchain.

Further down, he mentions, that this comes into play when discussing forks.