## Problem Description and Symbolic Representation

The problem can be broken down into the following components:

- **Variables:**
  - $x_1$ = Number of vehicle tickets sold
  - $x_2$ = Number of passenger tickets sold

- **Objective Function:**
  The company makes a profit of $130 for each vehicle and $60 for each passenger. The goal is to maximize profit, so the objective function is:
  - Maximize $130x_1 + 60x_2$

- **Constraints:**
  1. The company can sell at most 200 tickets: $x_1 + x_2 \leq 200$
  2. A minimum of 20 tickets are reserved for vehicles: $x_1 \geq 20$
  3. At least 4 times as many tickets are sold for passengers than vehicles: $x_2 \geq 4x_1$
  4. Non-negativity constraints: $x_1 \geq 0, x_2 \geq 0$

However, given that $x_1$ and $x_2$ represent tickets, they should be integers. But for the purpose of linear programming and to follow the initial request for a symbolic representation, we'll consider them as continuous variables first.

## Symbolic Representation in JSON Format

```json
{
  'sym_variables': [('x1', 'vehicle tickets'), ('x2', 'passenger tickets')],
  'objective_function': '130*x1 + 60*x2',
  'constraints': [
    'x1 + x2 <= 200',
    'x1 >= 20',
    'x2 >= 4*x1',
    'x1 >= 0',
    'x2 >= 0'
  ]
}
```

## Gurobi Code in Python

To solve this problem using Gurobi in Python, we can use the following code:

```python
import gurobi

def solve_boat_company_problem():
    # Create a new model
    model = gurobi.Model()

    # Define variables
    x1 = model.addVar(name="vehicle_tickets", lb=0, vtype=gurobi.GRB.INTEGER)
    x2 = model.addVar(name="passenger_tickets", lb=0, vtype=gurobi.GRB.INTEGER)

    # Objective function: Maximize 130*x1 + 60*x2
    model.setObjective(130*x1 + 60*x2, gurobi.GRB.MAXIMIZE)

    # Constraints
    model.addConstr(x1 + x2 <= 200, name="total_tickets")
    model.addConstr(x1 >= 20, name="min_vehicle_tickets")
    model.addConstr(x2 >= 4*x1, name="passenger_to_vehicle_ratio")

    # Solve the model
    model.optimize()

    # Print the solution
    if model.status == gurobi.GRB.OPTIMAL:
        print(f"Optimal solution: Vehicle tickets = {x1.varValue}, Passenger tickets = {x2.varValue}")
    else:
        print("No optimal solution found.")

solve_boat_company_problem()
```

This code defines the problem with Gurobi, solves it, and prints out the optimal solution if one exists. Note that we have explicitly set the variable types to `INTEGER` to reflect that tickets can only be whole numbers.