To solve this problem, we first need to define the variables and the objective function symbolically, followed by translating these into Gurobi code in Python.

The symbolic representation of the problem can be defined as follows:

- Let $x_1$ represent the number of guided tour packages sold.
- Let $x_2$ represent the number of regular tickets sold.

The objective function is to maximize profit. Given that the profit per guided tour package is $500 and the profit per regular ticket is $200, the objective function can be written as:

Maximize: $500x_1 + 200x_2$

The constraints based on the problem description are:
1. The total number of tickets sold (guided tour packages plus regular tickets) cannot exceed 300: $x_1 + x_2 \leq 300$
2. At least 50 guided tour packages must be reserved: $x_1 \geq 50$
3. At least twice as many people prefer to buy regular tickets than guided tour packages: $x_2 \geq 2x_1$

Thus, the symbolic representation in JSON format is:
```json
{
    'sym_variables': [('x1', 'number of guided tour packages'), ('x2', 'number of regular tickets')],
    'objective_function': '500*x1 + 200*x2',
    'constraints': ['x1 + x2 <= 300', 'x1 >= 50', 'x2 >= 2*x1']
}
```

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

```python
from gurobipy import *

# Create a new model
m = Model("Travel_Company_Profit")

# Define variables
x1 = m.addVar(vtype=GRB.INTEGER, name="guided_tour_packages")
x2 = m.addVar(vtype=GRB.INTEGER, name="regular_tickets")

# Set the objective function
m.setObjective(500*x1 + 200*x2, GRB.MAXIMIZE)

# Add constraints
m.addConstr(x1 + x2 <= 300, "total_tickets")
m.addConstr(x1 >= 50, "min_guided_tours")
m.addConstr(x2 >= 2*x1, "regular_vs_guided")

# Optimize the model
m.optimize()

# Print the solution
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Guided tour packages: {x1.x}")
    print(f"Regular tickets: {x2.x}")
    print(f"Total profit: ${500*x1.x + 200*x2.x}")
else:
    print("No optimal solution found")
```